今天我們繼續來認識 resources 剩下的用法吧!
這邊小小幫大家複習一下,假設我有一個訂單 (order) 並用 resources 產生 RESTful 的路徑:
Rails.application.routes.draw do
resources :orders
end
會產出以下的路徑:
到這邊相信大家一定都會。
接下來,我想要加上確認訂單以及取消訂單的路徑,resources 好像做的路徑好像不夠用。
這是後我們可以用 collection
或 member
,來協助我們。
我要看所有被取消的訂單,所以我想要路徑是長這樣:
# 被取消的訂單
GET /orders/cancelled
我們可以在resources 裡面加上 collection
:
Rails.application.routes.draw do
resources :orders do
collection do
get :cancelled
end
end
end
這樣就會有一個獨立的路徑 /orders/cancelled
,並產生紅色框框內的路徑:
除了 Block 的寫法,還可以這樣寫,效果會是一樣的:
Rails.application.routes.draw do
resources :orders do
get :cancelled, on: :collection
end
end
我要確認第 5 筆訂單或取消第 2 筆訂單,我希望可以產生出這樣的路徑出來:
# 確認 5 號訂單
POST /orders/5/confirm
# 取消 2 號訂單
DELETE /orders/2/cancel
但resources 的 8 條路徑好像不適用,我們這次可以在 resources 裡加上 member
:
Rails.application.routes.draw do
resources :orders do
member do
post :confirm
delete :cancel
end
end
end
會產生紅色框框內的路徑:
跟 collection
一樣,也可以這樣寫,效果會是一樣的:
Rails.application.routes.draw do
resources :orders do
post :confirm, on: :member
delete :cancel, on: :member
end
end
這兩者的差異在於:collection
沒有 :id
member
有 :id
以上面的例子來說:
collection
跟 member
。開發網站時會另外製作後台以便管理商品、訂單等功能,而這些功能通常都會跟一般使用者分開,網址上的設計會是這樣的:
http://www.example.com/admin/products
這時就可以使用 namespace
去把 resources 包住,讓後台有專屬的家:
Rails.application.routes.draw do
namespace :admin do
resources :products
resources :orders
end
end
這樣會產生以下的路徑:
namespace
與 scope
的用法類似,但是彈性較大。
根據上面 namespace
的用法,它所產生的路徑會去找相對應的 controller 。
但只是單純使用 scope
,它會改變所有的 path ,但不會改變相對應的 controller ,如下:
scope :admin do
resources :users
end
會產生以下路徑:
到這邊 route 大致上講得差不多了,但這只是冰山一角而已,大家可以去以下的參考資料攝取更多的用法。
參考資料: