Railsのroutes.rbを知る

routes.rbを使ってやろうかな?と思う事があったので、routes.rbを触ろうとしたら、
なんとなく知ってるけど、なんとなくじゃ・・・orz ということで知る。

基本

こちらの記事が素晴らしいです。
http://wota.jp/ac/?date=20050725

ポイントを列挙してみると

・URL書き換え機能
・ map.connect の部分がルール定義です。上から順番に評価されます。 第一引数に書き換え対象となる(ユーザによって入力された)URLのパスを表現し、第二引数以降に、マッチした時に表示するページを定義します。
・ (第一引数は文字列での比較というより、/^(第一引数)$/ という正規表現を思い浮かべる方がよいです)。
・ 以下の流れでページが表示されます。
 1. http://localhost:3000/ にアクセス (パスは"")
 2. route の1つめの定義の ^$ にマッチ
 3. route の1つめの指示で "berryz"コントローラの"index"アクションを呼び出す
 4. BerryzController#index を実行
 5. そこで render された内容をページとして表示
・ route では先頭に ":" がついていると"/"を除く任意の文字列にマッチして、その名前でCGI(コントローラ)の @params[(名前)] に入れてくれるのです。
・ちなみにこのように簡潔でわかりやすいURLを Pretty URLs と呼ぶようで、Rails でも推奨されています。(route は本来それを目的としたツール、という記述もあり)。対義語は Ugly URLs で、同じ例だとこういう感じでしょうか。
http://localhost:3000/nuke/modules.cgi?action=print&id=maiha&target=berryz&mode=quote&p=14488 ちょっと無理に書きましたが、本来こうなりがちなURLを '/' の順序に意味を持たせることでシンプルに表現してくれるのが route の機能なのです。
・ route の定義は、今まで見てきた「URL→コントローラ・アクションの決定」だけでなく「URL作成機能」にも影響します。
 # 2. controller, action が省略された場合は、現在のページのものが引き継がれます。
 url_for(:id=>'risyako')
 → "http://localhost:3000/berryz/show/risyako"
 ●上記はroutes.rbに「map.connect '', :controller => "berryz", :action=> "index"」と設定されている場合。
・ 定義も簡単で、'connect' の代わりに好きな名前を付けるだけで、"(名前)_url" で指定した controller, action 等を含むURLの作成ができるようになります。

今回僕が一番刺激を受けたポイントは、

・ちなみにこのように簡潔でわかりやすいURLを Pretty URLs と呼ぶようで、Rails でも推奨されています。(route は本来それを目的としたツール、という記述もあり)。対義語は Ugly URLs で、同じ例だとこういう感じでしょうか。
http://localhost:3000/nuke/modules.cgi?action=print&id=maiha&target=berryz&mode=quote&p=14488 ちょっと無理に書きましたが、本来こうなりがちなURLを '/' の順序に意味を持たせることでシンプルに表現してくれるのが route の機能なのです。


routes.rb を使って、リダイレクト機能的なものを作ろうと思ったのですが、本来はPretty URLs にすることが目的ですので、そのように使うべきかもなぁと思いました。
また、url_for や link_to にも影響してしまうので、リダイレクト機能的な使い方は具合がよくない場合もあるかもしれませんね。


実験した環境

Ruby 1.8.6
Rails 1.2.3