ActiveRecord_Associations_CollectionProxy的未定义方法[rails]

时间:2016-09-03 13:30:46

标签: ruby-on-rails ruby ruby-on-rails-4

我正在构建发票申请,并在_form部分我发了一张发票,用户可以在其中添加产品,包括数量,描述和单价。用户可以添加额外的行来添加更多项目(产品)。

现在,当我尝试在show视图中显示这些信息时:

    <tbody>
     <tr class="products_tr">
      <td> <%= @invoice.products.quantity %> </td>
      <td> <%= @invoice.products.description %> </td>
      <td> <%= @invoice.products.unitprice %> </td>
      <td class="row_total"><%= @invoice.products.quantity * @invoice.products.unitprice %></td>
      <td> <%= @invoice.products.btw %> </td>
     </tr>
    </tbody>

它会发出下一个错误:

undefined method `quantity' for #<Product::ActiveRecord_Associations_CollectionProxy:0x007fbe92831500>

这是控制器中的代码;

  def show
    @invoice.products.build
    @invoice.build_customer
  end

有关如何解决此问题的任何想法?帮助将不胜感激。还有一些要点可以解释我做错了什么。

修改

如果我循环通过@ invoice.products像MichałMłoźniak说它可以工作,但它还显示一个包含nil的额外行,如下所示: enter image description here

2 个答案:

答案 0 :(得分:1)

你自己说发票可以有很多产品,所以你需要一个循环来迭代这个产品列表。

<tbody>
  <% @invoice.products.each do |product| %>
    <% if product.persisted? %>
      <tr class="products_tr">
        <td> <%= product.quantity %> </td>
        <td> <%= product.description %> </td>
        <td> <%= product.unitprice %> </td>
        <td class="row_total"><%= product.quantity * product.unitprice %></td>
        <td> <%= product.btw %> </td>
      </tr>
    <% end %>
  <% end %>
</tbody>

答案 1 :(得分:0)

您的@invoice.products是一个集合,您应该在该集合中的每个对象上调用quantity