【问题标题】:Rails 3 routes to wrong controllerRails 3 路由到错误的控制器
【发布时间】:2011-08-10 20:19:31
【问题描述】:

我想创建一个新动作,我称之为“showemployees”。这就是我已经做过的:

-> 在控制器中:

def showemployees
end

-> 创建 app/views/employees/showemployees.html.erb

-> 在配置/路由中

match "/employees/showemployees" => "employees#showemployees"

我认为现在通过 localhost:3000/employees/showemployees 打开 showemployees.html.erb 就足够了,但似乎 Rails 仍然通过 show 操作路由(来自资源 :employees)并且不采取 showemployees-action,因为它告诉我

ActiveRecord::RecordNotFound in EmployeesController#show
Couldn't find Employee with ID=showemployees

为了让 Rails 执行 showemployees-action,我需要进行哪些更改?


我的路由源代码:

System::Application.routes.draw do

  match "/employees/showemployees" => "employees#showemployees" #für showemployees.html.erb

  root :to => "employees#index"

  resources :course_to_dos

  resources :current_qualifications

  resources :expected_qualifications

  resources :skills

  resources :employees

  resources :positions

  resources :admin


end

【问题讨论】:

  • 您是否尝试将match 语句放在resources 语句之前在您的routes.rb 中?在某些情况下,顺序很重要。
  • 是的,我已经把match放在每条语句之前,因为它在路由文件的cmets中写了顺序很重要,但它不起作用。 :(
  • 那么,您实际拥有哪条路线? match "/employees" 还是 match "/employees/showemployees"?您的示例与您所说的不符。
  • 我建议您将操作重命名为 show_multipleupdate_multiple,如果您有任何依赖项,请使用嵌套路由
  • 这对我来说“有味道”。 showemployees 动作做了什么而 index 动作不会?我同意米哈伊洛夫的观点

标签: ruby-on-rails ruby-on-rails-3 rails-routing


【解决方案1】:

尝试走 Rails-way,如果你想收集,使用收集

resources :employees do
  collection do
    get :showemployees
  end
end

【讨论】:

  • match "/employees" => "employees#showemployees" 不再需要
  • 太棒了!这工作顺利!为此,我不再需要 match- 方法了,对吗?并且只是为了理解,我们使用的就像它在 ruby​​guide (guides.rubyonrails.org/routing.html) 的第 2.9.2 章中写的一样?
  • 命名路由 match 对于非 REST 路由很有用,如果您需要一些特殊的东西或捕获未定义的路由 (*)。 RESTful 控制器是不错的方法,在设计架构时尽量保留它
【解决方案2】:

如果您发布完整的路由文件,我们可以进行明确的调用,但根据错误消息,您似乎有更广泛的路由定义映射到该路由上方定义的 employees#show匹配。

路由按照定义的顺序进行评估,因此如果您在窄路由之上定义了一个非常宽泛的路由模式,那么您的窄路由将永远不会被调用。

编辑:您需要从路由中删除正斜杠并将 showemployees 添加到实际 URL,以便它读取

 match "employees/showemployees" => "employees#showemployees" 

【讨论】:

  • 我在开头的帖子中添加了路由文件的源代码。有帮助吗?你还需要什么别的吗?即使我开头有match 声明,它仍然不想采取这种行动。
  • 您添加的路由文件显示match "/employees" => "employees#showemployees" 而不是match "/employees/showemployees" => "employees#showemployees"。更正应该可以为您解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2011-04-29
  • 1970-01-01
相关资源
最近更新 更多