今天繼續來探討 rails 的路徑寫法還有什麼眉角,看一看還真發現沒看過的寫法真多…
Shallow nesting
我們在使用 resource 表示路徑的時候,還可以做出巢狀的路徑
1 | resources :magazines do |
雖然很方便,但一般建議一次巢狀就夠了,幾乎沒有什麼需求會用到兩層巢狀結構
在巢狀結構下,有一種很常被使用:
1 | resources :articles do |
這個的意思是說,每一篇文章都有自己的 comment,在新增跟建立的時候需要知道是哪篇文章,但在檢視每一則 comment 還有編輯修改刪除的時候並不需要
因為太常用了,所以 Rails 賜它另一種好寫的方法
1 | resources :articles do |
變形的寫法還有很多種,但關鍵字就是 shallow ,有需要可以自己再來 Rails Guide 查
Concerns
假如我們今天 user 跟 post 都同時需要巢狀路徑,而底下那層都是 image,我們需要把同樣的 code 寫兩次
1 | resource :user do |
對於堅持 DRY 理念的攻城屍來說,同樣的東西寫兩次就是不舒服!
所以這樣的東西 Rails 也有提供另外的方法,上面的例子可以改寫如下:
1 | concern :imageable do |
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 裡面路徑的介紹就先到這裡了~
參考資料: