Help us understand the problem. What is going on with this article?

RailsのRoutingネストについて

More than 1 year has passed since last update.

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

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

image.png

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

ネストさせたことにより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

すると

image.png

こんな感じになります。

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

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

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

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

参照
・ https://techracho.bpsinc.jp/baba/2014_03_03/15619
・ https://railsguides.jp/routing.html

keisukegdk
香川県のSE兼、WEBエンジニア。現在はNestJS、Angularでアプリ開発中。 みなさまよろしくお願いします。
https://www.sanuki-kozo.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした