当模型单数和复数名称相同时(例如设备,物种),轨道链接路径和路由错误

时间:2012-07-07 02:23:13

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

<%= link_to t('.new', :default => t("helpers.links.new")), new_equipment_path, :class => 'btn btn-primary' %>

我在视图中有上述代码,但在点击链接时出现以下错误:No route matches {:action=>"show", :controller=>"equipment"}

我的路线文件包含:

resources :equipment

resources :workouts

match ':controller(/:action(/:id))(.:format)'

为什么要尝试访问show动作?

以下是我的路线中的条目:

   equipment_index GET        /equipment(.:format)                   equipment#index
                   POST       /equipment(.:format)                   equipment#create
     new_equipment GET        /equipment/new(.:format)               equipment#new
    edit_equipment GET        /equipment/:id/edit(.:format)          equipment#edit
         equipment GET        /equipment/:id(.:format)               equipment#show
                   PUT        /equipment/:id(.:format)               equipment#update
                   DELETE     /equipment/:id(.:format)               equipment#destroy

3 个答案:

答案 0 :(得分:6)

此问题有cropped up before ,与rails scaffolding如何为名为“设备”的模型生成new.html.erb文件有关,这些模型既可以是单数也可以是复数。< / p>

如果您检查new.html.erb文件中的form_for,则会在底部的link_to中看到equipment_path。对于具有单数==复数名称的这些模型,这些名称指的是实际用于show操作的路由,因此您的错误消息。

建议通常是“如果可以的话,避免像这样的模型名称”,或者它涉及到使用config / initializers / inflections.rb文件来强制复制版本的模型名称。当然,你最终会得到一个非常奇怪的模型引用的应用程序:'设备'不是很好用(以后有人会'修复'它,再搞乱了。)

要保持模型名称在语法上正确,您需要修复form_for即:。

<% form_for(@equipment, :url=> {:action=>'create'}) do |f| %>

和link_to:

<%= link_to 'Back', equipment_index_path %>

答案 1 :(得分:0)

您是否尝试在 routes.rb 中向equiment添加's'?

resources :equipments

答案 2 :(得分:0)

由于设备被认为是不可数名词,您应该能够使用变形来解决这个问题。

变形上的导轨documentation实际上使用设备作为其“变速器”的一部分。示例

将以下内容添加到config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable 'equipment'
end

其他信息:Uncountable Nouns in Rails 3 Resource Routing