なぜ深いネストを避けるのか
疑問
- ネストしたルーティングとは?
- なぜshallowオプションで深いネストを避けるの?
ネストしたルーティング
他のリソースの配下に子リソースを配置すること。親子関係をルーティングで表すためによく使うらしい。
前提アソシエーション作成
class User < ApplicationRecord has_many :comments end class Comment < ApplicationRecord belongs_to :user end
ユーザーという親、コメントという子
resources :users do resources :comments end
↓
生成されるパス
コレクション(IDを持たないアクション)
HTTP | URL | controller#action | 役割 |
---|---|---|---|
GET | /users/:user_id/comments | comments#index | あるuserに紐付くコメント全て |
GET | /users/:user_id/comments/new | comments#new | あるuserのcommentsを作成画面を返す |
POST | /users/:user_id/comments | comments#create | あるuserのcommentsをcreateアクションに送る(作成する) |
メンバー(IDを持つアクション)
HTTP | URL | controller#action | 役割 |
---|---|---|---|
GET | /users/:user_id/comments/:id | comments#show | あるuserのcommentsの一つを表示 |
GET | /users/:user_id/comments/:id/edit | comments#edit | あるuserのcommentsの編集画面を返す |
PATCH /PUT |
/users/:user_id/comments/:id | comments#update | あるuserのcommentsを編集する |
DELETE | /users/:user_id/comments/:id | comments#destroy | あるuserのcommentsを削除する |
あるユーザーに紐付いたコメントに関するURLが生成されている。
shallowオプション ー深いネストを避けるためにー
なぜ深いネストを避けるのか
下層のにあるテーブルのIDが一意なら、その上にあるテーブルのIDは不要という発想に基いています。
Railsの”shallow(浅い)”ルーティングを理解する - Qiitaより
IDが二つパスに含まれているものの、片方のパスだけで十分な場合に使用する。
方法 コレクション(IDを持たないindex/new/create)を親スコープの下で生成する
浅いネストを作る際は、メンバー(IDを持つshow/edit/update/destroy)をネストに含めないことがポイント。これにより、コレクションだけを階層化する。
resources :users do resources :comments, only: [:index, :new, :create] end resources :comments, only: [:show, :edit, :update, :destroy]
↓shallowオプション
によって、この浅いネストを略記することができる
resources :users do resources :comments, shallow: true end
浅いネストにすることで何が起こっているのか
※参考画像はboard(掲示板)とcomments (掲示板に対するコメント)のルーティング
shallowオプションなし
shallowオプションあり
確かにスッキリしている😳
ただ現場によってはshallowオプションを良しとしないところもあるらしい。。
親にshallowオプションをつけるパターン
resources :users shallow: true do resources :comments end
参考にしたサイト
shallowオプションを良しとしない理由 Railsの”shallow(浅い)”ルーティングを理解する - Qiita