感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

コントローラを使ってみよう!

<スポンサーリンク>

まずは、コントローラって何?ってところから始めます。
コントローラとは、全体の制御を受け持つものです。
このURLにアクセスしたらModelを呼び出してこのデータを取り出して、このViewを使って表示する、というような、全体の流れを制御(=Control)する役割を果たします。

Railsでは、このコントローラを担う機能は、app/controllersディレクトリ以下に格納されます。


コントローラクラスを作成するコマンドは以下のとおりです。

rails generate controller 名前 アクション1 アクション2・・・

ここでいう「名前」というのは、コントローラにつける名前です。
あとで書きますが、名前には厳格な命名規則があります。
まぁ、コマンドでコントローラを作れば、命名規則に沿った正しいコントローラを作ってくれます。

「アクション」というのは、コントローラで呼び出されるメソッドのことです。

実際に使ってみると、こんな感じになります。

$ rails generate controller samples index hoge

そうすると、
/app/controllers以下に、

・samples_controller.rb

というファイルが作成されます。
これは、「名前_controller.rb」という命名規則に則って作られています。

中を見てみると、def indexとか、def hogeというメソッドが書かれています。
これがアクションです。

$ cat samples_controller.rb 
class SamplesController < ApplicationController
  def index
  end

  def hoge
  end
end

上の例のとおり、コントローラーのクラス名は、名前Controllerという名前になります。
これは、命名規則でlk位待っています。
コントローラの名前は複数形で作るのが基本ですが、こちらについては規約ではありません。

ここで、アプリケーションのルート(appとかの一個上のディレクトリ)に移動して、

rails server

と入力してみましょう。

サーバが動き出します。
ブラウザから、

http://localhost:3000/samples/index

とリクエストを投げると、

Samples#index

Find me in app/views/samples/index.html.erb

と表示されます。

このリクエストURLは、

http://ドメイン/コントローラ/アクション

という規則に沿って設定されます。

では、ここで表示されたSamples#indexってどこに書かれているんでしょうか?
なぜ、何もしていないのに、画面が表示できたの?

それは、コントローラを作ったときに、「index.html.erb」というファイルが作られたからです。
これは、

/app/views/samples

の下にあります。
アクション.html.erbという命名規則になっています。
アクションに応じたビューが設定されているのですね。

中を見てみると、こんな風になっています。ブラウザに表示されてたものです。

ちなみに、「erb」というのは、Enbedded Rubyの略で、HTMLのコード内にRubyのコードを埋め込んで実行できる特殊なテンプレートファイルです。

$ cat index.html.erb 
<h1>Samples#index</h1>
<p>Find me in app/views/samples/index.html.erb</p>

では、なぜ以下のURLでビューの情報を表示させることができたのでしょう?

http://localhost:3000/samples/index

このURLはどうやってマッピングしているのでしょうか。

それは、
ルート/config/routes.rb
に秘密があります。

中を見てみると、以下のように、get 〜のような、記述があります。

Myapp::Application.routes.draw do
  get "samples/index"

  get "samples/hoge"

  ##いろいろなコメントアウトされた情報
end

これは、

get "コントローラ/アクション"
post "コントローラ/アクション"

のような命名規則で書かれていて、getとかpostはHTTPのメソッドに対応します。

URLを任意に作りたい場合は、以下のように書きます。

match "アドレスの指定" => "コントローラ#アクション"

試してみましょう。

  #get "samples/hoge"
  match "fuga" => "samples#hoge"

と書き直して、

http://localhost:3000/fuga

とリクエストを投げてみます。

すると、ブラウザには

Samples#hoge

Find me in app/views/samples/hoge.html.erb

と表示されました。

次回以降もコントローラを色々と使って遊んでみましょう。
この記事は、とりあえずここまでにします。


【参考文献】
HerokuではじめるRailsプログラミング入門

Ruby on Rails 3 ポケットリファレンス