Ruby on rails 3 Rails 3路线:如何避免与';显示';行动?
我目前为Ruby on rails 3 Rails 3路线:如何避免与';显示';行动?,ruby-on-rails-3,url,routes,Ruby On Rails 3,Url,Routes,我目前为照片设置了以下路线: resources :photos match 'photos/:user' => 'photos#user', :as => :user_photo match 'photos/:user/:key' => 'photos#show', :as => :show_photo 这两条match路由为我提供如下URL: http://example.com/photos/joe_schmoe http://example.com/photos
照片设置了以下路线:
resources :photos
match 'photos/:user' => 'photos#user', :as => :user_photo
match 'photos/:user/:key' => 'photos#show', :as => :show_photo
这两条match
路由为我提供如下URL:
http://example.com/photos/joe_schmoe
http://example.com/photos/joe_schmoe/123xyz
…类似于Flickr格式化其URL的方式
不过,我遇到的问题是,photos/:user
路由要么被解释为show
方法,要么如果我将这些自定义路由放在资源之前,那么像/new
这样的路由就会被解释为user
方法
我如何在不做大量自定义路由的情况下绕过此问题?您需要将此自定义路由置于资源:用户
之上,以便在路由中首先匹配它
match 'photos/:user' => 'photos#user', :as => :user_photo
resources :photos
此外,您还可以完全禁用show
操作:
resources :photos, :except => :show
在同一资源上混合使用restful路由和自定义匹配路由不是一个好主意。正如您所观察到的,这两条路线将互相拦截。您最好的选择是为一个资源只选择一个路由系统并坚持使用它。如果需要flickr样式的路由,应该删除restful路由,并为可能需要的new/create/etc添加其他必要的匹配路由。如果您非常希望保留这两条路由,则需要在rest路由位于顶部时从rest路由禁用show,或者在match位于顶部时从match路由禁用new。您可以使用regexp从match中筛选出一些请求,如下所示:
match 'photos/:user' => 'photos#user', :as => :user_photo, :constraints => { :user => /.*[^n][^e][^w].*/ }
这很快就会变得难看,我建议根本不要使用rest路线。很好,:除了
,这就是我要找的。