讃岐小僧のEngineering×Techメモ

未経験から挑戦中のプログラミングや、趣味の野球や狩猟について、その他、ビジネスやテクノロジーをテーマに様々なことをつぶやく場所です。

【Rails】Routingのネスト

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

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

image.png

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で確認してみます。 image.png

ネストさせたことによりanime/:anime_id/reviewとなったことが確認できると思います。 また、ネストさせることによってconfig/route.rbの記述量を減らすことができ、ルールにしたがってURLを振ることができます。

「resources」と「resource」の違いについて

複数形と単数形の複数系がありますが、これは単純に対象のオブジェクトが複数あるか単数なのか違いです。

具体的にいうと、、、 例えば地球は一つしかありません。でも地球の中には国がいっぱいあるとした時。 こんな感じでroutingが書けます。

Rails.application.routes.draw do
resource :earth do
  resources :country
 end
end

すると

image.png

こんな感じになります。

先ほどとの違いは、地球は1つしかないのでidを振られていません。逆にanimeは複数あったのでidが振られていました。 ただもし、宇宙の中に惑星がたくさんあって地球はそのうちの一つみたいな考え方をする場合はidを振らなければいけなさそうなのでresourcesと書くのが適切になりそうです。

という感じで整理すればいいと思います。

ネストは一回までにしましょう。

ルーティングのネストは実際は一階層以上させることはできますが、複雑になり扱いづらくなるため推奨されていないようです。