我正在开发一个项目管理web应用程序,我必须通过页面查看项目。一个用于查看所有项目,另一个用于管理用户拥有的项目(即管理员)。
现在,通过使用"projects_path"(/projects)可以访问项目的概览页面。然而,对于项目管理页面,我想有另一个url,"项目/管理",它就在这里,我需要帮助。
我尝试过以下几种:
路由.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'
当我明确地将其设置为指示我"管理"(项目#管理)时,为什么它会指示我执行操作"显示"?显然,它想要一个"id",但这里不应该是这样,因为我想显示所有的项目(用户拥有的),而不是特定的。
我该如何解决这个问题?
如果您在多个项目上执行管理操作,最好用以下方式编写收集操作,
resources :projects do
collection do
get "manage"
end
end
这将为您提供路由/项目/管理,将自动匹配路由以管理操作,并且每件事都将符合REST约定。
Rails应用程序收到传入请求时
GET /projects/17
它要求路由器将其与控制器动作相匹配。如果第一条匹配路线是
match "/projects/:id" => "projects#show"
请求被发送到项目控制器的show操作,params中有{:id=>"17"}。
类似地,当您的Rails应用程序接收到传入请求时
GET /projects/manage
它要求路由器将其与控制器动作相匹配。如果第一条匹配路线是
match "/projects/manage" => "projects#manage", :as => 'manage_projects'
请求被分派到项目控制器的管理操作,而不必担心路由中没有给定的id。
但是,如果项目的第一个匹配路由是项目的资源本身,那么它将执行show操作,因为它将把manage
视为您的id
,就像拥有/projects/:id
一样,并且匹配将被跳过。
因此,这取决于你首先给出了什么,即资源或匹配。优先级很重要。
此行
match "/projects/manage" => "projects#manage", :as => 'manage_projects'
最有可能添加在CCD_ 4之后。把这条线移到资源线之上,你就应该表现得很好。类似的东西
match "/projects/manage" => "projects#manage", :as => 'manage_projects'
resources :projects
更新:
路线已排序。文件顶部的路由优先。如果resources :projects
在match "/projects/manage" => "projects#manage", :as => 'manage_projects'
之前,转到/projects/manage
将转到项目控制器的显示操作,因为它与/projects/manage
之前的/projects/:id
匹配