Rails Routing part2

Posted by Anthony Chao on 2019-10-03

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

Shallow nesting

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

1
2
3
resources :magazines do
resources :ads
end

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

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

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

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

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

1
2
3
resources :articles do
resources :comments, shallow: true
end

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

Concerns

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

1
2
3
4
5
6
7
8
resource :user do
resource :image
end


resources :posts do
resource :image
end

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

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

1
2
3
4
5
6
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 的選項來修改

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

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

HTTP Verb Constraints

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

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

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

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

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

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

參考資料:

Rails Guide

Rails routes concerns





prevent_hack