Routingをいじってみた

ブログのアプリケーションを作ってみようと思って、ちょうどRailsによるアジャイルWebアプリケーション開発のAction Controllerの章にブログのURLパターンを設定する例があったのでやってみました。

本に載ってるのはこんな感じでした。ただ、controllerだけ自分で別に作っちゃっていたので元は"blog"となっていたところを"articles"としています。(ここがあとで迷う事になるポイントだったかも)

map.connect  "blog/",
                      :controller => "articles", #本では"blog"
                      :action => "index"
                        
map.connect  "blog/:year/:month/:day",
                      :controller => "articles", #本では"blog"
                      :action => "show_date",
                      :requirements => {  :year => /(19|20)¥d¥d/,
                                                      :month => /[01]?¥d/,
                                                      :day => /[0-3]?¥d/},
                      :day => nil,
                      :month => nil

つまり、

http://hogehoge.com/blog/

でトップページを表示して最近の数件を出して、

http://hogehoge.com/blog/2006/02/10

と打つと2006年2月10日の記事だけ表示するというよくあるパターンです。

これに合わせて記事のタイトル部分をlink_toを使って作ろうと思ったわけです。タイトル部分だけ抜き出すとこんな感じ。

<% for article in @articles %>

<%= link_to article.title, :action => "show_date" %>

<% end %>

でも、当然これだとRoutingErrorが出てしまいます。
Routingで設定した通りに

<%= link_to article.title, :action => "show_date", :year => article.year, :month => article.month, :day => article.day %>

のように書いたらちゃんとリンクを生成してくれました。

初め、controllerを指定して"blog"とか"articles"と入れなければいけないのかなと思ったのですが、"blog"だとRoutingErrorが出ました。たしかに"blog"はcontrollerじゃないですね。同じように"articles"とやったら動きましたが、指定しなくても同じく動きました。controllerは特に指定しなくても勝手にRoutingから判断してくれてるみたいですね。かしこくてうれしいなぁ。
解決してしまうとなんでこんなとこで引っかかったのかと思うようなことなんだけど、ハマっちゃいました。"blog/:year/:month/:day"となっているところで、どこがcontrollerでどれがactionなのか分からなくなってしまってました。Routingで書いた、controller、action、requirementsの内容を指定すれば良いだけなんですね。これでRoutingをいじっても怖くない!かも!

追記

バックスラッシュが化けてたからとりあえず&#165;で代用。バックスラッシュってどうやって表示させるんだっけ。。。