ruby on rails-令人困惑的路由问题



我正在开发一个项目管理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 :projectsmatch "/projects/manage" => "projects#manage", :as => 'manage_projects'之前,转到/projects/manage将转到项目控制器的显示操作,因为它与/projects/manage 之前的/projects/:id匹配

相关内容

  • 没有找到相关文章

最新更新