iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Modern Web

Ruby新手村的礦工日記系列 第 21

[ Day 21 ] Rails : 迷路了?先問問 Route 吧!(下)

  • 分享至 

  • xImage
  •  

今天我們繼續來認識 resources 剩下的用法吧!
這邊小小幫大家複習一下,假設我有一個訂單 (order) 並用 resources 產生 RESTful 的路徑:

Rails.application.routes.draw do
  resources :orders
end

會產出以下的路徑:
order 路徑
到這邊相信大家一定都會。

Collection 與 Member

接下來,我想要加上確認訂單以及取消訂單的路徑,resources 好像做的路徑好像不夠用。
這是後我們可以用 collectionmember ,來協助我們。

Collection

我要看所有被取消的訂單,所以我想要路徑是長這樣:

# 被取消的訂單
GET /orders/cancelled

我們可以在resources 裡面加上 collection

Rails.application.routes.draw do
  resources :orders do
    collection do
      get :cancelled
    end
  end
end

這樣就會有一個獨立的路徑 /orders/cancelled ,並產生紅色框框內的路徑:
collection
除了 Block 的寫法,還可以這樣寫,效果會是一樣的:

Rails.application.routes.draw do
  resources :orders do
    get :cancelled, on: :collection
  end
end

Member

我要確認第 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

會產生紅色框框內的路徑:
member 路徑
collection 一樣,也可以這樣寫,效果會是一樣的:

Rails.application.routes.draw do
  resources :orders do
    post :confirm, on: :member
    delete :cancel, on: :member
  end
end

兩者差異

這兩者的差異在於:
collection 沒有 :id
member:id
以上面的例子來說:

  • 我要看所有被取消的訂單,沒有必要去用 id 去找,我只在乎所有被取消的訂單。
  • 我要確認第 X 筆訂單跟取消第 X 筆訂單,這邊我在乎的是第 X 筆訂單,所以 id 會是我需要去在乎的東西。
    我們可以依照需求去選擇使用 collectionmember

Namespace 與 Scope

Namespace

開發網站時會另外製作後台以便管理商品、訂單等功能,而這些功能通常都會跟一般使用者分開,網址上的設計會是這樣的:

http://www.example.com/admin/products

這時就可以使用 namespace 去把 resources 包住,讓後台有專屬的家:

Rails.application.routes.draw do
  namespace :admin do 
    resources :products
    resources :orders
  end
end

這樣會產生以下的路徑:
nameaspace

Scope

namespacescope 的用法類似,但是彈性較大。
根據上面 namespace 的用法,它所產生的路徑會去找相對應的 controller 。
但只是單純使用 scope ,它會改變所有的 path ,但不會改變相對應的 controller ,如下:

scope :admin do
  resources :users
end

會產生以下路徑:
scope

到這邊 route 大致上講得差不多了,但這只是冰山一角而已,大家可以去以下的參考資料攝取更多的用法。

參考資料:

  1. 為你自己學 Ruby on Rails
  2. [Rails] routes 的使用
  3. Rails Guides

上一篇
[ Day 20 ] Rails : 迷路了?先問問 Route 吧!(中)
下一篇
[ Day 22 ] Rails 中的 Controller 跟 View !!
系列文
Ruby新手村的礦工日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言