0

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

现在可以通过使用“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”,这里不应该是这种情况,因为我想显示所有项目(用户拥有的),而不是特定的。

我该如何解决这个问题?

4

3 回答 3

0

这条线

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

很可能是在 之后添加的resources :projects。将那条线移到资源一上方,你应该会很好。就像是

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

更新:

路线是有序的。文件顶部的路由优先。如果resources :projects是 before match "/projects/manage" => "projects#manage", :as => 'manage_projects'/projects/manage则转到项目控制器的 show 动作,因为它匹配/projects/:idbefore/projects/manage

于 2013-02-11T08:40:10.463 回答
0

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

GET /projects/17

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

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

请求被分派到项目控制器的显示操作,参数中带有 { :id => “17” }。

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

GET /projects/manage

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

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

请求被分派到项目控制器的管理操作,而不用担心路由中没有给出的 id。

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

所以这取决于你首先给出了什么,即资源或匹配。优先级很重要。

于 2013-02-11T08:52:14.763 回答
0

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

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

这将为您提供路线 /projects/manage,将自动匹配路线以管理操作,并且每件事都将按照 REST 约定。

于 2013-02-11T09:00:12.147 回答