Edited at

RailsのRoutingネストについて


RailsのRoutingのネストについて、整理してみた。 

そもそものお話。

RailsにおけるルーティングとはViewで受け取ったURLを認識してコントローラ内に定義したアクション(メソッド)に割り当てる働きをするものです。

Railsのルーティングはconfig/routes.rbで設定します


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の標準的な機能を想定したルーティングを設定してくれます。


config/routes.rb

>>Rails.application.routes.draw do

 resources :review
end

上記のように記述するとこんな感じでルーティングを設定してくれます。


Routingをネストさせる

さてここで本題です。

今、アニメのレビューサイトを作ろうとしていて、1つのアニメに対してたくさんのレビューがあるとします。もし、一つ一つのレビューのURLを特定の規則に則って振り分ける場合、サイトのURLはおそらく「https://×××××××/anime/id/review/id」とかになるはずです。

こんな時にRoutingをネストさせます。

ネストの書き方


config/routes.rb

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が書けます。


config/routes.rb

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