4月生募集中!当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のDMM WEBCAMP(旧WEBCAMP PRO)。
3月生は満員となっております。4月生募集に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

はじめに

Railsの基本アーキテクチャは「Model」「View」「Controller」の3つで構成されている「MVC」です。

そのため、MVCについて知っておくのは、Railsプログラマーとして当然と言えるでしょう。

データベースからデータを取得したり、書き込んだりする「Model」や、画面表示のテンプレートである「View」は直感的に分かりやすいでしょう。

しかし、ModelやView、ブラウザとのやりとりを行う「Controller」が、具体的にどんな役割を持っているのか、少し分かりにくいと感じる人も少なくありません。

そんな、Controllerについて、作り方と削除の仕方、どんなことをさせるべきか、詳しく解説していきます。

Controllerとは

ControllerはMVCの他の2つと違って、少しつかみ所がない部分があります。そのため、「Controllerとは?」と問われて即答できない人もいることでしょう。

簡潔には、Controllerは「アプリケーションの動きを制御する要」なのです。

そのため、Controllerにはアプリケーションへの要求(ブラウザからのリクエスト)に合わせた処理をするメソッドを実装しておかなければいけません。

それらのメソッドのことを「アクション」と呼んでおり、ほとんどの場合、アクションごとにブラウザへ返す表示テンプレートとしてViewが用意されています。

なお、Railsアプリケーションのルーティング設定によって、リクエストごとにどのControllerのアクションが実行されるのかが決められています。

そのため、「アクション内でどんなことをするのか」というのが、リクエストに対するRailsアプリケーションの応答内容を決めることになるわけです。

MVCのController

改めて、MVCについて、説明しましょう。

MVCは、以下のように構成されています。

※便宜上ブラウザも1つの要素として説明していますが、図の通り、ブラウザはRailsアプリケーション外のものです

つまり、ブラウザからのリクエストを元にModelやViewからデータを受け取って、ブラウザへ応答を返すのが、Controllerの役割と言えます。
※モデルは必ずしも必要ではありません。データベースとのやりとりが不要な処理の場合は、Controllerとモデルがやりとりをしない場合もあります

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー

Controllerを作る

では、実際にControllerを作成する方法を説明していきます。

Controllerはmodelと同じように、「rails generate」コマンドで生成することができます。

ここでは、すでにRails環境があるものとして説明していきます。必要な人は「rails new アプリケーション名」で、テスト用の環境を生成しておいてください

Controllerを生成するコマンドの基本構文は、以下のようになっています。

rails generate controller コントローラ名 [アクション名1 アクション名2 ..]

アクション名は省略可能です。すでに搭載するアクションが決まっているのであれば、同時に生成することもできます。

今回はController名が「ControllerSamples」、「test」アクションを持つ、Controllerを生成してみましょう。

rails generate controller ControllerSamples test

実行すると、以下のようなログが出力され、生成したファイルやディレクトリを教えてくれます。

      create  app/controllers/controller_samples_controller.rb
       route  get 'controller_samples/test'
      invoke  erb
      create    app/views/controller_samples
      create    app/views/controller_samples/test.html.erb
      invoke  test_unit
      create    test/controllers/controller_samples_controller_test.rb
      invoke  helper
      create    app/helpers/controller_samples_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/controller_samples.coffee
      invoke    scss
      create      app/assets/stylesheets/controller_samples.scss

テスト用のファイルやヘルパー用のファイル、cssファイルなども生成してくれていますが、今回説明するControllerそのものに関する重要なものは、次の3つです

app/controllers/controller_samples_controller.rb

Controllerの実態となるクラスが格納されるファイルです。メソッドとしてアクションも記載されていますので、Controllerで行う処理を記載していくファイルとなります。
※なお、ログの「 route get 'controller_samples/test'」という行は、testアクションに対するルーティングの設定追加です

ファイルの内容を確認すると、空のControllerSamplesControllerクラスとtestアクションがあるだけで、処理は一切書かれていません。
(app/controllers/controller_samples_controller.rb)

class ControllerSamplesController < ApplicationController
  def test
  end
end

app/views/controller_samples

今回生成したControllerSamplesController用のViewファイルを格納するディレクトリです。この中に、アクションごとのViewファイルが格納されます。

app/views/controller_samples/test.html.erb

今回生成したtestアクション用のViewファイルです。testアクションの結果を表示するテンプレートとなります。

自動生成されたばかりのViewファイルは、アクション名とファイルの格納場所を表示するだけのものです。
(app/views/controller_samples/test.html.erb)

<h1>ControllerSamples#test</h1>
Find me in app/views/controller_samples/test.html.erb

命名規則

前項で、1点、何か不思議な部分があったことに気が付いている人もいるかもしれません。

じつは、ファイル名やクラス名などで、自動変換されている部分があるのです。

Railsは様々なファイルやクラス、メソッドなどの関連付けをファイル名やクラス名、メソッド名などで行っていますので、その命名規則に合った適切なものに自動変換しているのです。

そんな、Railsの命名規則をまとめておきましょう。

まず、大原則として、クラスやモジュール、ファイル名、クラス名などを表す命名規則は、次のようになっています。

名称 規則
クラス名・モジュール名 キャメルケース ControllerSamples
ファイル名・ディレクトリ名 スネークケース controller_samples
メソッド名・変数名 スネークケース controller_samples.rb

なお、「キャメルケース」「スネークケース」というのは、以下のような文字列のことです。

キャメルケース:各単語の頭文字を大文字にして単語をつなげて作る文字列
スネークケース:すべて小文字で単語と単語の間を「_」でつなげて作る文字列

大原則に基づいて、Controllerは、以下のような規則の下にファイルやクラスが生成されます。

名称 規則
コントローラ名 モデルを利用する場合は、必ず複数形にする controller_samples
コントローラのクラス名 キャメルケースのコントローラ名Controller ControllerSamplesController
コントローラファイル名 スネークケース controller_samples_controller.rb
アクション名 スネークケース test
Viewファイル名 アクション名.html.erb test.html.erb

命名規則を理解できれば、Rails全体のクラス間の関連性をスムーズに理解できますので、意識しておきましょう。

なお、単語の単数形や複数形についても、Railsでは自動で関連付けるようになっていますので、重要なポイントです。

基本的には、扱うモデルの数で区別されています。(モデルはテーブル内の1行分のデータだと考えてください)

Controllerは1つのControllerで複数のモデル(複数行のデータ)を扱いますので、基本的には複数形の単語を使うのです。

アクション

先ほど生成したControllerのアクション、testを実行してみましょう。

「rails s」コマンドでサーバを起動して、「localhost:3000/controller_samples/test」へアクセスしてみると、以下のように表示されます。

この表示から、testアクションを実行することで、前項で確認したViewファイルが表示されていることが分かります。つまり、空のアクションであっても、Viewファイルが呼び出されて表示されるわけです。

アクションは、ブラウザからのリクエストに応えるものですので、最終的には必ず何らかのレスポンスを返さなければいけないのです。

Viewを表示したくない場合

いきなりですが、アプリケーションを作っていく中で、Viewを表示したくない場合もあるものです。

その場合は、アクションの中で「renderメソッド」を利用することで、自動的に表示されるView以外を表示することが可能です。(記載なしでも表示されるViewを明示的に表示することもできます)

例えば、テキストを表示してみましょう。
(app/controllers/controller_samples_controller.rb)

class ControllerSamplesController < ApplicationController def test render :plain => 'Hello!'
  end
end

※Rails4以前のバージョンの場合は、「render :text => 'Hello!'」になります

renderメソッドは1アクションで1回しか呼ぶことができません。そのため、アクション内に明示的に記載することで、自動的に呼ばれなくなったわけです。

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】

アクションに処理を記載する

では、アクションで処理を行ってみましょう。

今回のアクション「test」はテスト用の画面表示のアクションです。

ただし、何の動きもないのは面白くありませんので、表示回数をカウントしてみましょう。

具体的には、アクセスされるたびに、数を1ずつ増やすカウンターを設置します。

まずは、Viewファイルに表示するHTMLを追加しましょう。
(app/views/controller_samples/test.html.erb)

<h1>ControllerSamples#test</h1>
Find me in app/views/controller_samples/test.html.erb
<%= "Access Count = #{@count}" %>

「@count」にカウンターの数値が入ります。

次に、アクセスするたびにカウンター(@count)を+1していく処理をtestアクションへ追加します。(前項で追加したrenderメソッドの行は削除してください)
(app/controllers/controller_samples_controller.rb)

class ControllerSamplesController < ApplicationController
  def test
    if session[:count].nil?
      session[:count] = 1
    else
      session[:count] += 1
    end
    @count = session[:count]
  end
end

カウンターの値は、サイトから離れてページ遷移しても保持する必要があります。そのため、sessionを利用してカウントし、それを表示用のインスタンス変数@countへ代入しています。(sessionについては、「【Rails入門説明書】sessionについて解説」を参照してください)

これで、Controller でカウントした値をViewへ送り込むことができるようになりました。

実際に、アクセスして確認してみましょう。最初のアクセスでは「Access Count = 1」が表示されます。


F5キーを押すなどして、再表示すると、カウンターが1ずつ増えます。

Controllerを削除する

Controllerの作成方法を説明してきましたので、削除する方法も説明しておきます。

Controllerの削除は、「rails destroy」コマンドを使用します。

rails destroy コントローラ名

このコマンドを実行することで、「rails generate」コマンドで生成されたファイルやディレクトリが削除されます。

ただし、「config/routes.rb」内のルーティング設定は削除されませんので、自分で削除する必要があります。注意してください。

未経験から上京し、エンジニアとしてチームラボグループに転職!【WebCampPro卒業生インタビュー】

Controllerに記載すべきこと

ここまでで、Controllerの実装の基本的な部分は説明しました。

しかし、Railsアプリケーションを作っていく中で、「Controllerにどこまで処理を記載するべきか?」という疑問が出てきます。

Railsは、モデルとView、そしてControllerとで構成されています。

そして、多くの場合、モデル、Controller、Viewのどこに実装しても動くものを作ることは可能です。しかし、「動く」だけでは、プロの成果物としてのプログラムにはなりません。

プログラムは、可読性とメンテナンス性を意識したものでなければ、優れたプロの成果物とは言えないわけです。

そういった観点でControllerを作るために意識すべきポイントは、以下の2点です。

 ・アクションの役割(仕事)は1つに絞る
 ・できる限り、アクションの役割を表すコードのみ記載する

この2点を意識して、先ほど作ったtestアクションを見てみましょう。

残念ながら、testアクションは「テスト用の画面表示」の役割のはずですが、カウント処理を行っています。

これでは、「表示」という役割がぼやけてしまって、可読性が良くありません。

また、もし、カウント処理が変更となった場合、testアクションが修正されることになりますので、カウント処理そのものだけではなく、表示処理にも影響が及ぶ可能性が出てきます。

そのため、testアクションの役割を明確にしましょう。

役割分担のもっとも簡単な方法は、メソッド化するなどして、別にしてしまうことです。

では、カウント処理をメソッド化してみます。
(app/controllers/controller_samples_controller.rb)

class ControllerSamplesController < ApplicationController
  def test
    @count = accsess_count
  end

  private
    def accsess_count
      if session[:count].nil?
        session[:count] = 1
      else
        session[:count] += 1
      end
    end
end

access_countメソッドにカウント処理を分けました。

こうすることで、testアクションには「表示するための処理」だけが残りましたので、とてもシンプルになっています。

このようにカウント処理を分けてしまうことで、仮にカウント方法などに変更がかかっても、testアクションそのものを修正する必要がありませんので、画面表示に影響が及ぶことはありません。

まとめ

RailsのControllerについて、解説しました。

冒頭にも書きましたが、ControllerはRailsの基本的なアーキテクチャ「MVC」を構成する大事な要素の1つです。

「MVC」を理解しなければ、中級プログラマーへの道は遠くなってしまうばかりですので、しっかりとその概念を学習しましょう。

また、合わせて、MVCそれぞれの役割や分業の仕方なども意識することで、可読性やメンテナンス性の高いプログラムを書くことができますので、十分に意識していくことが重要です。

ただし、このあたりの概念的な部分などは、参考サイトや書籍などの文字情報では、お伝えするのに十分ではありません。

こういった部分を学習するのは、現場での経験や有識者からの助言など、生の情報が一番です。もし、スクールなどで生の声を聞くことができる機会があれば、ぜひ活用していきましょう。


・Controllerは「Railsアプリケーションの動きを制御する要」
・Controllerには、ブラウザからのリクエストに応えるメソッド(アクション)が実装される
・アクションごとにViewが作られる
・空のアクションを実行しても、Viewが表示される
・1アクションでrenderは1回のみ実行できる
・アクションは明確な役割を持たせ、役割以外の処理は書かない

DMM WEWBCAMPについて

DMM WEBCAMPは3ヶ月間で未経験から即戦力エンジニアを育成する転職保障付きのプログラミングスクールです。1ヶ月でプログラミング・Webデザインを学ぶ通い放題の「ビジネス教養コース」も展開しています。

DMM WEBCAMPを運営する株式会社インフラトップ では、「学びと仕事を通して人生を最高の物語にする」という理念で会社を経営しています。

キャリアアップを目指す方は、この機会に私達と一緒にプログラミングを学んでみませんか?

4月枠も残りわずか当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のDMM WEBCAMP(旧WEBCAMP PRO)。
3月受入枠は満員となっております。4月枠に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

▼未経験から1ヶ月でWEBデザイン・プログラミングを学びたい方はこちら!

 

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

おすすめの記事