Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Rails 3路线:如何避免与';显示';行动?_Ruby On Rails 3_Url_Routes - Fatal编程技术网

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路线。

很好,
:除了
,这就是我要找的。