iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
0
Modern Web

Rails guide / Ruby API study系列 第 27

[ Rails guide study ]Day27 Rails Routing part2

  • 分享至 

  • xImage
  •  

[ Rails guide study ] Day26 Rails Routing part2

首先,來聽首歌吧
Yes
Kimberly 的歌聲我一直都還滿喜歡的,覺得像這樣離鄉背井的歌手實在應該好好支持他!


今天繼續來探討 rails 的路徑寫法還有什麼眉角,看一看還真發現沒看過的寫法真多...

Shallow nesting

我們在使用 resource 表示路徑的時候,還可以做出巢狀的路徑

resources :magazines do
  resources :ads
end

雖然很方便,但一般建議一次巢狀就夠了,幾乎沒有什麼需求會用到兩層巢狀結構

在巢狀結構下,有一種很常被使用:

resources :articles do
  resources :comments, only: [:index, :new, :create]
end
resources :comments, only: [:show, :edit, :update, :destroy]

這個的意思是說,每一篇文章都有自己的 comment,在新增跟建立的時候需要知道是哪篇文章,但在檢視每一則 comment 還有編輯修改刪除的時候並不需要

因為太常用了,所以 Rails 賜它另一種好寫的方法

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

變形的寫法還有很多種,但關鍵字就是 shallow ,有需要可以自己再來 Rails Guide 查

Concerns

假如我們今天 user 跟 post 都同時需要巢狀路徑,而底下那層都是 image,我們需要把同樣的 code 寫兩次

resource :user do
  resource :image
end


resources :posts do
  resource :image
end

對於堅持 DRY 理念的攻城屍來說,同樣的東西寫兩次就是不舒服!

所以這樣的東西 Rails 也有提供另外的方法,上面的例子可以改寫如下:

concern :imageable do
  resource :image
end

resource :user, concerns: :imageable
resources :posts, concerns: :imageable

Naming Routes

在使用 rails 的時候,大家一定都知道可以使用 resources 自動幫你加的路徑名字,比方說 candidates controller 裡面的 new 方法的路徑叫做 new_candidate_path,實際上我們可以用 as 的選項來修改

get 'exit', to: 'sessions#destroy', as: :logout

就像這樣,我們如果使用 logout_path 就可以連結到 /exit 這個 url 了!

HTTP Verb Constraints

如果我們在碰到想要讓很多動作同時指到同一個路徑的話,可以使用 via 這個選項

match 'photos', to: 'photos#show', via: [:get, :post]

這個例子中,只要你的路徑是 /photos ,不管動詞是 get 還是 post 都能到這個頁面

除此之外,還可以使用 all 表示全部的 action 都可以到這裡:

match 'photos', to: 'photos#show', via: :all

Rails 裡面路徑的介紹就先到這裡了~

參考資料:

Rails Guide

Rails routes concerns

本文章同步分享於 http://anthonychao.site/


上一篇
[ Rails guide study ]Day26 Rails Routing part1
下一篇
[ Rails guide study ]Day28 Active Record Query Interface part1
系列文
Rails guide / Ruby API study30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言