我有如下嵌套资源:
resources :categories do
resources :products
end
根据Rails Guides,
就我而言,我有以下功能齐全的代码:
<% @products.each do |product| %>
<tr>
<td><%= product.name %></td>
<td><%= link_to 'Show', category_product_path(product, category_id: product.category_id) %></td>
<td><%= link_to 'Edit', edit_category_product_path(product, category_id: product.category_id) %></td>
<td><%= link_to 'Destroy', category_product_path(product, category_id: product.category_id), method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
显然,这有点太冗长,我想使用上述Rails指南中提到的技巧来缩短它。
但是,如果我按如下所示更改了显示和编辑链接:
<% @products.each do |product| %>
<tr>
<td><%= product.name %></td>
<td><%= link_to 'Show', [product, product.category_id] %></td>
<td><%= link_to 'Edit', [:edit, product, product.category_id] %></td>
<td><%= link_to 'Destroy', category_product_path(product, category_id: product.category_id), method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
它们都不起作用了,这些页面提示着同样的事情:
NoMethodError in Products#index
Showing /root/Projects/foo/app/views/products/index.html.erb where line #16 raised:
undefined method `persisted?' for 3:Fixnum
我错过了什么?
最佳答案
通过检查为类传递的对象,然后寻找名称匹配的 Controller ,Rails可以“自动地”知道要使用的路径。因此,您需要确保传递给link_to
帮助器的是实际的模型对象,而不是像category_id
这样的东西,后者只是fixnum
,因此没有关联的 Controller 。
<% @products.each do |product| %>
<tr>
<td><%= product.name %></td>
<td><%= link_to 'Show', [product.category, product] %></td>
<td><%= link_to 'Edit', [:edit, product.category, product] %></td>
<td><%= link_to 'Destroy', [product.category, product], method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
关于ruby-on-rails - Rails : route helpers for nested resources,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29802919/