我正在开发一个项目管理网络应用程序,我需要用于查看项目的页面。一个用于查看所有项目,另一个用于管理用户拥有的项目(即管理员)。
现在可以通过'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',这不应该是这里的情况因为我想要显示所有项目(用户拥有),而不是特定的。
我该如何解决这个问题?
答案 0 :(得分:0)
这一行
match "/projects/manage" => "projects#manage", :as => 'manage_projects'
最有可能在resources :projects
之后添加。将该行移到资源之上,你应该很好。
match "/projects/manage" => "projects#manage", :as => 'manage_projects'
resources :projects
更新:
订购路线。文件顶部的路由优先。如果resources :projects
在match "/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约定进行。