RailsのRoutingのネストについて、整理してみた。
そもそものお話。
RailsにおけるルーティングとはViewで受け取ったURLを認識してコントローラ内に定義したアクション(メソッド)に割り当てる働きをするものです。
Railsのルーティングはconfig/routes.rbで設定します
>>Rails.application.routes.draw do
get 'URL' => コントローラー名#メソッド
なんちゃら
なんちゃら
end
こんな感じのやつです。
アプリケーションでどういう風に設定されているかは下記のコマンドをTerminalで叩いて確認します。
rake routes
or
bundle exec rake routes
##resouce/resourcesとかいうやつ
アプリケーション開発していくとRoutingの記述がかなり増えてきて、とても見辛くなってしまいます。
そこでresourcesの登場です。
routingにて特定のコントローラーに対してresoucesを記述することによりindex、create、new、edit、show、update、destroyの標準的な機能を想定したルーティングを設定してくれます。
>>Rails.application.routes.draw do
resources :review
end
上記のように記述するとこんな感じでルーティングを設定してくれます。
##Routingをネストさせる
さてここで本題です。
今、アニメのレビューサイトを作ろうとしていて、1つのアニメに対してたくさんのレビューがあるとします。もし、一つ一つのレビューのURLを特定の規則に則って振り分ける場合、サイトのURLはおそらく「https://×××××××/anime/id/review/id」とかになるはずです。
こんな時にRoutingをネストさせます。
ネストの書き方
Rails.application.routes.draw do
resources :anime do
resources :review
end
end
このようにRoutingをネストさせるとどうなったかrake routesで確認してみます。
ネストさせたことによりanime/:anime_id/reviewとなったことが確認できると思います。
また、ネストさせることによってconfig/route.rbの記述量を減らすことができ、ルールにしたがってURLを振ることができます。
##「resources」と「resource」の違いについて
複数形と単数形の複数系がありますが、これは単純に対象のオブジェクトが複数あるか単数なのか違いです。
具体的にいうと、、、
例えば地球は一つしかありません。でも地球の中には国がいっぱいあるとした時。
こんな感じでroutingが書けます。
Rails.application.routes.draw do
resource :earth do
resources :country
end
end
すると
こんな感じになります。
先ほどとの違いは、地球は1つしかないのでidを振られていません。逆にanimeは複数あったのでidが振られていました。
ただもし、宇宙の中に惑星がたくさんあって地球はそのうちの一つみたいな考え方をする場合はidを振らなければいけなさそうなのでresourcesと書くのが適切になりそうです。
という感じで整理すればいいと思います。
##ネストは一回までにしましょう。
ルーティングのネストは実際は一階層以上させることはできますが、複雑になり扱いづらくなるため推奨されていないようです。
参照
・ https://techracho.bpsinc.jp/baba/2014_03_03/15619
・ https://railsguides.jp/routing.html