【问题标题】:Rails 3 Routing: non-CRUD controllerRails 3 路由:非 CRUD 控制器
【发布时间】:2012-05-07 14:23:25
【问题描述】:

在将路由从 Rails 2 转换为 Rails 3 时,我需要一些帮助。

在app/views/layouts/application.html.erb,我有:

<%= link_to "Reports", reports_path %><br>

有一个ReportsController,在app/views/reports/index.html.erb,我有这个:

<%= link_to "Clients With Animals", :action => "getAnimals", :controller => "clients" %>

然后,在 config/routes.rb 中,我有这个(Rails 3)

match '/reports' => "reports#index"
match '/clients/getAnimals', to: "clients#getAnimals"

单击报告页面上的“getAnimals”链接时出现此错误:

ActiveRecord::RecordNotFound in ClientsController#show
Couldn't find Client with id=getAnimals

我不希望“getAnimals”成为 ID - 我希望它成为动作。

我该怎么做?

【问题讨论】:

  • routes.rb 中还有什么else?在/clients/getAnimals 匹配之前 是否有与URL 匹配的内容?像客户端资源,还是类似的?

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


【解决方案1】:

假设您还有一个 resources :clients 条目,您要确保 match '/clients/getAnimals', to: "clients#getAnimals" 在它上面(Rails 将匹配它首先遇到的任何内容)。

但是,更好的方法可能是将其放入资源中:

resources :clients do
  get 'getAnimals', :on => :collection
end

【讨论】:

  • @dave_newton 和 Dylan,非常感谢。 Dave 的问题是完全相关的 - '/clients/getAnimals' 上方有资源 :clients,所以它是匹配的。 Dylan 的两个建议都有效 - 我正在使用第二个建议,将其放入资源中。非常感谢,这么快就回复了。
  • 我还有一个与此相关的问题。在 Rails 2 中,您可以这样做 - map.connect '/reports', :controller => "reports" 并将任何操作(如 getAnimals)发送到报告索引。在 Rails 3 中,有没有一种通用的方法,或者我必须在 resources :clients 下列出每个特定操作?
  • 您可以执行match 'reports(/:action(/:id))(.:format)' =&gt; 'reports' 之类的操作,这将允许/reports/getAnimals 和/reports/forAnimal/40 等操作。
  • 迪伦,再次感谢。使用这种方法,我得到一个让我非常困惑的错误,“没有路线匹配 [GET] 资产”。我读了一些关于“资产管道”的文章,似乎如果你没有在资源中放一些东西,你就不会得到资产。您的解决方案,从早期开始(涉及将其放入客户端资源中)消除了资产错误。我怀疑我对 Rails 3 路由的理解不够好。再次感谢您花时间回答。
猜你喜欢
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
相关资源
最近更新 更多