#ルーティングのネストとは
通常のルーティングの記述は
Rails.application.routes.draw do
resources :親となるコントローラー
resources :親となるコントローラー
resources :親となるコントローラー ,,,,,
end
という感じでそれぞれ独立した形でコントローラーへのルーティングを生成していますが、
ルーティングのネストをすると、あるコントローラーのルーティング内に、別のコントローラーのルーティングを記述することができます
Rails.application.routes.draw do
resources :親となるコントローラー do
resources :子となるコントローラー ←階層を下げ、do,,,endで囲む
end
end
#使用するメリット
例えば、インスタグラムやツイッターなどにはコメント機能があります。
そして、そのコメントは、必ず投稿先が存在しています。
それでは、ネストをしないでルーティングを設定した場合と、ネストをした場合の生成されるルーティングの違いを見てみます。
####ネストなし
Rails.application.routes.draw do
#省略
resources :tweets
resources :comments, only: :create
end
Prefix Verb URI Pattern Controller#Action
#省略
comments POST /comments(.:format) comments#create
####ネストあり
Rails.application.routes.draw do
#省略
resources :tweets do
resources :comments, only: :create
end
end
Prefix Verb URI Pattern Controller#Action
#省略
tweet_comments POST /tweets/:tweet_id/comments(.:format) comments#create
URIに注目して下さい。コメントには投稿先が必ずあるのにも関わらず、ネストをしない場合のルーティングは、どの投稿先のコメントなのかを示す情報がありません。
それに対し、ネストをした場合は、tweet_idの箇所にツイートのid番号が入ります。それにより、どのツイートに対するコメントなのかというのがURIから判断できるようになります。
#まとめ
・ネストをすることで関係性のあるもの(アソシエーション先)のid情報が取得できます