shallow nesting 是用來把路徑(也就是我們的網址)縮短的技巧。
在 Rails 的 model 內常常會有 belongs_to、has_many 的關聯。
假設我現在要做一個筆記留言的路徑,因為 note has_many :comments、comment belongs_to :note,
所以假如我要刪除2號筆記裡面的3號留言,我的路徑會是 /notes/2/comments/3。
不過因為留言的 id 不會跟別的留言重複的關係,其實就算不用去2號筆記內我也可以直接觀看、編輯、刪除3號留言,
為了讓路徑看起來比較不囉唆,這時候 shallow nesting 這個技巧就可以派上用場了!
從下圖可以看到 index、new、create 的路徑沒有 id
這是因為 index 是要顯示2號筆記的所有留言、new 是新建一個留言所需要的頁面、而 create 是新建一個留言,
這三個都不需要有特定的 id。
而其他像是 show 要顯示3號留言、edit 是編輯3號留言所需要的頁面、update 要更新3號留言、destroy 要刪除3號留言,都是需要特定的 id 才能夠操作。
resources :notes do
resources :comments, only: [:index, :new, :create]
end
resources :comments, only: [:show, :edit, :update, :destroy]
範例1會讓 index、new、create 的路徑維持 /notes/2/comments
而 show、edit、update、destroy 的路徑變成 /comments/3
如此一來可以讓路徑看起來簡潔一點。
resources :notes do
resources :comments, shallow: true
end
如果使用 Rails 內建的 shallow nesting,就可以有這個效果。
像是範例2在 resources :comments 後面加上 shallow: true 就可以直接變成範例1的效果,
是不是很方便呢!
參考:
[1]Rails Routing from the Outside In