ほんとは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
で定義されています。
map.connect '/ads/:id', :controller => 'ads', :action => 'show'
例えば上記のコードがroutes.rb
に書かれた場合の、実際のルーティングの動作を本書では以下のように説明されている。そのまま抜粋。書籍のほうではこれに加えて表やイラストも付いていて、なおわかりやすい。
- Railsは、ブラウザーからリクエストを受け取ると、そのリクエストパスをroutes.rbに渡して、マッチするルーティングを探します。
- 一致したルートにシンボルが含まれていた場合、ルーティングシステムによってリクエストパラメータテーブルparams[...]に、一致したパラメータが作成されます。先頭がコロンで始まる文字列は、シンボルと認識されます。
- また、ルートではparams[...]に挿入する追加パラメータの指定も行えます。
:controller
と:action
は、しばしばここで指定されます。 - routes.rbでの処理を終えると、Railsはparams[:controller]の値を参照し、どのコントローラーオブジェクトを作成すべきかを決定します。
- コントローラーオブジェクトを作成したら、Railsはparams[:action]に格納されている値を用いて、コントローラー内にあるメソッドを選択し、呼び出します。
- コントローラーメソッドの呼び出しが完了すると、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)