2011-02-13 95 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].*/ } 

这变得丑陋真快,寿,我只是建议不使用其他途径都没有。