Rails:路由帮助器的嵌套资源

我嵌套的资源如下:

resources :categories do
  resources :products
end

根据Rails指南,

你也可以使用url_for和一组对象,Rails会自动确定你想要的路线:

<%= link_to 'Ad details', url_for([@magazine, @ad]) %>

在这种情况下,Rails会看到@magazine是一个杂志,@ad是一个广告,因此将使用magazine_ad_path帮助程序。 在像link_to这样的助手中,您可以只指定对象来代替完整的url_for调用:

<%= link_to 'Ad details', [@magazine, @ad] %>

对于其他操作,只需将操作名称作为数组的第一个元素插入即可:

<%= link_to 'Edit Ad', [:edit, @magazine, @ad] %>

在我的情况下,我有以下代码完全可用:

<% @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 %> 

显然它有点过于冗长,我想用导轨上面提到的技巧缩短它。

但是,如果我更改了显示和编辑链接,如下所示:

<% @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

我错过了什么?


Rails的方式是'自动'知道要使用的路径是通过检查你传递给它们的类的对象,然后查找名称匹配的控制器。 所以你需要确保你传递给link_to helper的是实际的模型对象,而不是像category_id那样只是一个fixnum ,因此没有相关的控制器。

<% @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 %>

我猜测这些违规行是其中之一:

<td><%= link_to 'Show', [product, product.category_id] %></td>
<td><%= link_to 'Edit', [:edit, product, product.category_id] %></td>

product.category_id是一个Fixnum ,路由不能知道一个随机数应该映射到category_id

使用以前的网址,它们更具可读性。

链接地址: http://www.djcxy.com/p/18451.html

上一篇: Rails: route helpers for nested resources

下一篇: Rails nested resource creation on separate pages