アインシュタインの電話番号
2011.04.02
Rails 2のルーティングが行っていること

ほんとはRails 3をやりたいところだけど、日本語での書籍はまだほとんどなく、とりあえずRailsの概念というかお作法を学ぶのなら2も3も大差ないと思って、Rails入門の良書として評判の高いHead First Railsを読んでRails 2を勉強中。

Railsは最初に覚えることがやたら多い印象で、以前に一度やろうとして挫折した経験がある。scaffoldで10分でブログ作成みたいなやつを一通りやってみたものの、言われたとおりにやっただけで、実際に何が起こってるのかはさっぱり理解できず、そこから先に進むことができなかった。で、そのあとにSinatraに出会ってあまりの簡単さに感動して以来Sinatraを使ってるんだけど、そろそろRailsに再挑戦してもいい頃合だと思ってリベンジ。

そのRailsで、当時理解できなかったものの1つに「どこで、どうやってURLが決定されているのか」というのがあったんだけど、本書のルーティング解説を読んでやっと理解できた。

ルーティング(routes.rb)が行なっていること

前述の書籍では、ルーティングについて以下のように説明されている。

Railsには、あるURLに対してどのコードを実行すればよいかを判断するルールが必要です。これは、Railsにおいて設定が必要になる、ごくまれな局面です。 Railsでは、URLパスとコードをマッピングするために使用されるルールのことを、ルートと呼びます。ルートは、Rubyで書かれた config/routes.rb で定義されています。

Head First Rails - 頭とからだで覚えるRailsの基本 (P.57)

map.connect '/ads/:id', :controller => 'ads', :action => 'show'

例えば上記のコードがroutes.rbに書かれた場合の、実際のルーティングの動作を本書では以下のように説明されている。そのまま抜粋。書籍のほうではこれに加えて表やイラストも付いていて、なおわかりやすい。

  1. Railsは、ブラウザーからリクエストを受け取ると、そのリクエストパスをroutes.rbに渡して、マッチするルーティングを探します。
  2. 一致したルートにシンボルが含まれていた場合、ルーティングシステムによってリクエストパラメータテーブルparams[...]に、一致したパラメータが作成されます。先頭がコロンで始まる文字列は、シンボルと認識されます。
  3. また、ルートではparams[...]に挿入する追加パラメータの指定も行えます。:controller:actionは、しばしばここで指定されます。
  4. routes.rbでの処理を終えると、Railsはparams[:controller]の値を参照し、どのコントローラーオブジェクトを作成すべきかを決定します。
  5. コントローラーオブジェクトを作成したら、Railsはparams[:action]に格納されている値を用いて、コントローラー内にあるメソッドを選択し、呼び出します。
  6. コントローラーメソッドの呼び出しが完了すると、Railsはparams[:action]の値に一致するページテンプレートを呼び出します。ページテンプレートによってレスポンスが生成され、ブラウザーに返されます。

この解説を読むまで、Rails用語としてたびたび出てくる「アクション」のことをメソッド(5番)のことを指していると思っていたけど、Railsにおけるアクションとはメソッド(5番)とテンプレート(6番)のセットのことであるっぽい。

Sinatraで書くと

上のルーティングのコードを、Sinatraで同じように書くとこんな感じだろうか。

get '/ads/:id' do
  p params[:id]  #=> パラメータの受け取り方・引き出し方はRailsと一緒
  show
  slim :show
end
def show
  # hogehoge
end
__END__
@@ show
/* fugafuga */

Sinatraに用意されているget/put/post/deleteなどのRESTなメソッドが、Railsのルーティングに相当し、上記で定義しているshowメソッドとshowテンプレート(Slim)が、Railsの:actionで指定した部分に相当する。あれ、:controllerはどこだろう? Sinatraでは:controllerに相当するものはないのかなあ。あと、Rails側でGET以外を定義する方法をまだ理解していない。まぁ、本書を読んでいればそのうち出てくるんじゃないかな。


Head First Rails - 頭とからだで覚えるRailsの基本 (pp.57-59)