Rails 3路线:如何避免与'show'动作发生冲突?

时间:2011-02-13 04:16:03

标签: ruby-on-rails-3 url routes

我目前为photos设置了以下路线:

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格式化其网址的方式。

我遇到的问题是,photos/:user路由被解释为show方法,或者如果我将这些自定义路由放在resources之前,那么路由就像/new被解释为user方法。

如何在不做大量自定义路线的情况下解决这个问题?

2 个答案:

答案 0 :(得分:8)

您需要将此自定义路由置于上方resources :users,以便在路由中首先匹配。

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

此外,您可以完全禁用show操作:

resources :photos, :except => :show

答案 1 :(得分:1)

在同一资源上将restful路由与自定义匹配路由混合起来并不是一个好主意。正如您所观察到的那样,这两条路线将拦截彼此的行动。您最好的选择是为资源选择一个路由系统并坚持使用它。如果你想要flickr样式路由,你应该删除restful路由并为你可能需要的new / create / etc添加其他必要的匹配路由。如果你拼命想要保留这两条路线你需要在其余路线上禁用显示其余路线,或者在匹配路线位于顶部时禁用匹配路线中的新路线。您可以使用regexp从匹配中过滤掉一些请求:

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

这很快变得丑陋,我建议根本不使用其余路线。