上一章介紹了 routes 的工作環境,以及淺談了 RESTful 。
今天要來介紹好用的方法,讓你不用寫一堆網路請求的路徑。
上一章有提到 Rails 是依照 RESTful 的方式去設計網址,除了一條一條寫外,其實可以使用 Rails 提供 resources ,以貼文為例:
Rails.application.routes.draw do
resources :posts
end
當在 routes.rb 裡面寫這段之後,它會自動幫你生成 8 條路徑。
在終端機輸入 rails routes -c posts
,會出現以下:
這邊幫大家整理成一個表格讓大家更清楚這 8 條路徑是在做什麼的:
動詞 | Prefix | 路徑 | Controller | Action | 說明
------------- | -------------
GET | posts | /posts | PostController | index | 全部貼文列表
POST | posts | /posts | PostController | create | 新增貼文
GET | new_post | /posts/new | PostController | new | 新增貼文頁面
GET | edit_post | /posts/:id/edit | PostController | edit | 編輯貼文頁面
GET | post | /posts/:id | PostController | show | 檢視單一貼文
PATCH | post | /posts/:id | PostController | update | 更新貼文
PUT | post | /posts/:id | PostController | update | 更新貼文
DELETE | post | /posts/:id | PostController | destroy | 刪除貼文
雖然 resources 可以產生 8 條路徑,但是可能有些路徑是不需要的,這時你可以篩選一下:
Rails.application.routes.draw do
resources :products, only:[:index, :show]
end
Rails.application.routes.draw do
resources :products, except: [:new, :create, :edit, :update, :destroy]
end
其實上面這兩種的意思都是說,我只要 index, show,其他的我都不要。
只是表達的方式不一樣,但都會產生以下的路徑:
什麼時候要用 only
什麼時候要用 except
?
老實說,看你方便,以上面的例子,你應該知道要用哪一個吧!
我是會選 only
,因為字數比較少,比較省時間。
單數與複數的 resources 有什麼差別呢?
差別在於複數的有 :id
,複數的沒有 :id
跟 index
,如下:
Rails.application.routes.draw do
resource :profile
end
產生的路徑如下:
當某一個 resources 包住另一個 resources 時,例如:
Rails.application.routes.draw do
resources :magazines do
resources :ads
end
end
它會產生以下的路徑:
使用者可以檢視、新增 posts。
文章擁有者可以顯示、編輯、刪除 posts。
Rails.application.routes.draw do
resources :users do
resources :posts, only: [:index, :new, :create]
end
resources :posts, only: [:show, :edit, :update, :destroy]
end
路徑會變這樣:
但是你也可以使用 shallow: true
,這樣也有一樣的效果。
Rails.application.routes.draw do
resources :users do
resources :posts, shallow: true
end
end
關於路徑更多用法,下一章會在提供給大家!
參考資料: