Railsのルーティングについてちょっとしらべていた
わけあって
/hoge/:hoge_id/:fugas
みたいな感じのルーティングをやりたかったので、ちょっと調べていました。
基本のルーティング
まず何も設定しなかった場合のルーティングです。この場合はいたってシンプル。
/:controller(/:action(/:id(.:format)))
というふうになっています。
ルーティングの書き換えと確認
config/routes.rbというファイルを編集してルーティングを書き込んでいきます。
ルーティングの確認は実際にアプリを起動してもいいのですが、
rake routes
と打ち込むとどういうルーティングが設定されているか確認することができます。
matchで書き換え
match "ルート", :to => 'コントローラー#アクション', :via => "メソッド", :as => "ルート名"
ハッシュで渡しているのはすべてオプションです。ぶっちゃけると今回はこれ使ってないので、:as で渡しているルート名の意味がいまいちよくわかってません。
それresourcesで一括指定できるよ
matchでちまちまやっていってもいいのですが、アプリケーションの基本である生成、表示、編集、削除といったものは似たようなルートになりますよね。これをいちいち書くのはバグの温床です。というわけでこういう記法が使えます。
resources :hoges
こうするだけで、以下のルートを一括指定できます。
/hoges(.:format) | 一覧画面 |
/hoges/:id(.:format) | 詳細画面 |
/hoges/new(.:format) | 登録画面 |
/hoges(.:format) | 登録処理 |
/hoges/:id/edit(.:format) | 編集画面 |
/hoges/:id(.:format) | 更新処理 |
/hoges/:id(.:format) | 削除処理 |
ネストすることもできるらしく、
resources :hoges do resources :fugas end
とやると
/hoges/:hoge_id/
以下に上の表のルートが、hogesのところがfugasになってできます。
あとはオプションでなんとかなるはず
ここまできたらあとはパスを単数形に書き換えてあげればよさそうです。幸いなことにresourcesには :path を渡してやるとパスを書き換えてくれます。
resources :hoges, :path => 'hoge' do resources :fugas end
こうすれば冒頭の要件は満たせそうです。ところが…
/hogesで一覧が見れるようにしておいてほしいなぁ
ということなのでもう少しオプションをつけてやる必要がありそうです。とりあえず一覧は複数形、それ以外は単数形としましょう。こういうときは:onlyと:exceptを使いましょう。結果こうなりました。
resources :hoges, :only => [:index] resources :hoges, :except => [:index], :path => 'hoge' do resources :fugas end
これで一件落着。無事に仕様通りのルーティングにできました。