ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

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

これで一件落着。無事に仕様通りのルーティングにできました。