Rails Diary

プログラミングの学習記録です。

なぜ深いネストを避けるのか

疑問

  • ネストしたルーティングとは?
  • なぜshallowオプションで深いネストを避けるの?

ネストしたルーティング

2.7 ネストしたリソース Railsガイド

他のリソースの配下に子リソースを配置すること。親子関係をルーティングで表すためによく使うらしい。

前提アソシエーション作成

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オプション ー深いネストを避けるためにー

2.7.2 浅いネスト Railsガイド

なぜ深いネストを避けるのか

下層のにあるテーブルの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オプションなし f:id:okmt_Aya_26:20220130205502p:plain

shallowオプションあり f:id:okmt_Aya_26:20220130205455p:plain

確かにスッキリしている😳
ただ現場によってはshallowオプションを良しとしないところもあるらしい。。

親にshallowオプションをつけるパターン

resources :users shallow: true do
  resources :comments
end

参考にしたサイト

2.7 ネストしたリソース Railsガイド

2.7.2 浅いネスト Railsガイド

shallowオプションを良しとしない理由 Railsの”shallow(浅い)”ルーティングを理解する - Qiita