iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
Modern Web

網頁前後端寶石庫-礦坑補完計畫系列 第 28

Day 28 Rails shallow nesting

阿修說文解字

甚麼是 shallow nesting?

shallow nesting 是用來把路徑(也就是我們的網址)縮短的技巧。

為什麼要用 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 才能夠操作。

範例1(不使用 Rails 內建的 shallow nesting):

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
如此一來可以讓路徑看起來簡潔一點。

範例2(使用 Rails 內建的 shallow nesting):

resources :notes do
  resources :comments, shallow: true
end

如果使用 Rails 內建的 shallow nesting,就可以有這個效果。
像是範例2在 resources :comments 後面加上 shallow: true 就可以直接變成範例1的效果,
是不是很方便呢!

參考:
[1]Rails Routing from the Outside In


上一篇
Day 27 Ruby == vs ===
下一篇
Day 29 Rails soft delete - paranoia
系列文
網頁前後端寶石庫-礦坑補完計畫30

尚未有邦友留言

立即登入留言