2011-02-13 52 views
3

我目前已建立了photos以下途徑:Rails 3路線:如何避免與'show'動作衝突?

resources :photos 
match 'photos/:user' => 'photos#user', :as => :user_photo 
match 'photos/:user/:key' => 'photos#show', :as => :show_photo 

這兩個match路線給我的網址,如:

http://example.com/photos/joe_schmoe 
http://example.com/photos/joe_schmoe/123xyz 

...相似到Flickr格式的URL的方式。

時遇到的問題,不過,是該photos/:user路線要麼解釋爲show方法,或者如果我把這些自定義路線resources之前然後像/new路線得到解釋爲user方法。

如何解決這個問題,而無需做大量的自定義路線?

回答

8

您需要將此自定義路線放在以上resources :users,以便它在路線中首先匹配。

match 'photos/:user' => 'photos#user', :as => :user_photo 
resources :photos 

此外,您可以完全禁用show行動:

resources :photos, :except => :show 
+0

不錯,`:except`就是我一直在尋找的東西。 – Shpigford 2011-02-13 14:25:36

1

這不是一個好主意,在相同的資源使用自定義比賽的路線寧靜的路線混合。正如你觀察到的,這兩條路線將會攔截對方的行動。您最好的選擇是爲資源選擇一個路由系統並堅持使用它。如果你想要flickr風格的路線,你應該刪除寧靜的路線,併爲你可能需要的new/create/etc添加其他必要的匹配路線。如果您拼命想要保留這兩條路線,您需要禁用其餘路線中的顯示,其餘路線位於最上方,或者在匹配位於頂部時從匹配路線中禁用新的路線。您可以使用正則表達式過濾掉這樣從比賽的一些要求:

match 'photos/:user' => 'photos#user', :as => :user_photo, :constraints => { :user => /.*[^n][^e][^w].*/ } 

這變得醜陋真快,壽,我只是建議不使用其他途徑都沒有。