[Rails] 分辨 collection do 和 member do

在 rails 的路由世界裡,有著非常厲害的的管理方式
當用戶端 client 做了什麼任何 http 請求 request,請求動作像是post
這樣的一個行為
會透過 rails 的 routes.rb 做一個解析
然後丟給 controller 去做判讀,再幫助使用,得到特定的畫面

當你在 routes 裡面設定:

  1. resources ,就會自動添加 7 個action ,也同時擁有 8 個 path
  2. resource ,就會不會有 #index#show
  3. 當我想要特殊路徑,或者一個特別操作處理?就得使用 collection do , member do
  4. 如果我想要創建一個,判別的後台路徑,那我可以用 namespace

什麼是 collection do ?

舉一個例子,在購物車裡面,刪除整個購物清單

routes.rb
1
2
3
4
5
resources :carts do
collection do
delete :clean
end
end

就是對於 指定resources 內,複數集合,做什麼 http-veb
這樣 rails 會去找 carts_controller ,並指向 clean 這個 method

這樣的路徑結果,不會有 id

Helper HTTP verb path Controller#Action
clean_carts_path DELETE /carts/clean(.:format) carts#clean

什麼是 member do ?

舉一個例子,想要將該產品,單一加入購物車

routes.rb
1
2
3
4
5
resources :products do
member do
post :add_to_cart
end
end

就是對於 指定resources 內,單數集合,做什麼http-veb
這樣 rails 會去找 products_controller ,並指向 add_to_cart 這個 method
這樣的路徑結果,會有 id,因為必須要是指定的產品

Helper HTTP verb path Controller#Action
add_to_cart_product_path POST /products/:id/add_to_cart(.:format) products#add_to_cart

簡單定義 namespaces ?

routes.rb
1
2
3
namespace :admin do
resources :products
end

網址會產生 /admin/products

其實就是一個綽號的概念,
在台灣追星的粉絲門,會喜歡模仿偶像
所以常常自稱是 土城李宗盛,三重劉德華這樣的稱號出現
土城,就是一個區別,沒特別意義,讓你一眼就知道土城人
李宗盛,就是代表,你也是做很多壞事進監獄
不是啦!那是李宗瑞…XDDDDD,李宗盛,是唱歌很有老人韻的
李宗盛,劉德華就是指擁有什麼厲害的能力(功能),或者外表(介面)

網站前台,創建一個 product_controller,控制 product index 的介面
當我們想要區別前台和後台,讓admin 下也有一個 product_controller,控制 product index 的介面

namespaces 的用法就是一種區別的方式!

Ref:
【豆知识】 routes.rb中: resources 、namespace、member 和 collection的使用区别
極推薦:
為你自己學 Ruby on Rails

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×