令人困惑的路由问题

时间:2013-02-11 08:36:46

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

我正在开发一个项目管理网络应用程序,我需要用于查看项目的页面。一个用于查看所有项目,另一个用于管理用户拥有的项目(即管理员)。

现在可以通过'projects_path'(/ projects)访问项目的概述页面。但是对于项目管理页面,我想要另一个网址,“项目/管理”,这里我需要帮助。

我尝试了以下内容:

routes.rb中:

match "/projects/manage" => "projects#manage", :as => 'manage_projects'

查看:

<%= link_to "Manage projects", manage_projects_path %>

会引发以下错误:

Couldn't find Project with id=manage
app/controllers/projects_controller.rb:62:in `show'

为什么当我明确地将其设置为“管理”(项目#manage)时,它会指示我执行'show'?显然它想要一个'id',这不应该是这里的情况因为我想要显示所有项目(用户拥有),而不是特定的。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

这一行

match "/projects/manage" => "projects#manage", :as => 'manage_projects'

最有可能在resources :projects之后添加。将该行移到资源之上,你应该很好。

之类的东西
match "/projects/manage" => "projects#manage", :as => 'manage_projects'
resources :projects

更新:

订购路线。文件顶部的路由优先。如果resources :projectsmatch "/projects/manage" => "projects#manage", :as => 'manage_projects'之前,则转到/projects/manage会转到项目控制器的show动作,因为它与/projects/:id之前的/projects/manage匹配

答案 1 :(得分:0)

当您的Rails应用程序收到传入请求时

GET /projects/17

它要求路由器将其与控制器操作相匹配。如果第一个匹配的路线是

match "/projects/:id" => "projects#show"

使用{:id =&gt;将请求分派到项目控制器的show动作中参数中的“17”}。

同样,当您的Rails应用程序收到传入请求时

GET /projects/manage

它要求路由器将其与控制器操作相匹配。如果第一个匹配的路线是

match "/projects/manage" => "projects#manage", :as => 'manage_projects'

将请求分派给项目控制器的管理操作,而不会打扰路由中未提供的ID。

但是如果项目的第一个匹配路由是项目的资源本身,那么它将进行show动作,因为它会将manage视为id,就像拥有/projects/:id并匹配将被跳过。

所以这取决于你首先给出的是资源还是匹配。优先权很重要。

答案 2 :(得分:0)

如果您正在对多个项目执行管理操作,最好以下列方式编写集合操作,

 resources :projects do
   collection do
    get "manage" 
   end 
 end

这将为您提供路由/项目/管理,将自动匹配管理操作的路由,并且每个事物都将按照REST约定进行。