has_many循环undefined方法

时间:2017-11-24 03:39:52

标签: ruby-on-rails ruby-on-rails-5

我有一个has_many关联,我想在表格中显示。每个代理最多可以进行3次销售,但我想将它们列在与代理相同的行中。

undefined method `each' for nil:NilClass on the <% sales.each do |s| %> line.

虽然每列都有明确的数据,但我收到了上述错误

<table>
    <tr>
        <td>Agent</td>
        <td>Date</td>
        <td>Product</td>
        <td>Price</td>
        <td>Date</td>
        <td>Product</td>
        <td>Price</td>
        <td>Date</td>
        <td>Product</td>
        <td>Price</td>
    </tr>
    <% @agent.sales.each do |agent, sales| %>
    <tr>
        <td><% agent.name %></td>
        <% sales.each do |s| %>
        <td><%= s.date %></td>
        <td><%= s.product %></td>
        <td><%= s.price %></td>
        <% end %>
    </tr>
    <% end %>
</table>

2 个答案:

答案 0 :(得分:1)

这应该有效:

<table>
    <tr>
        <td>Agent</td>
        <td>Date</td>
        <td>Product</td>
        <td>Price</td>
        <td>Date</td>
        <td>Product</td>
        <td>Price</td>
        <td>Date</td>
        <td>Product</td>
        <td>Price</td>
    </tr>
    <% @agent.sales.each do |sale| %>
    <tr>
        <td><% @agent.name %></td>
        <td><%= sale.date %></td>
        <td><%= sale.product %></td>
        <td><%= sale.price %></td>
    </tr>
    <% end %>
</table>

答案 1 :(得分:1)

首先,由于@agent.salesActiveRecord_Associations_CollectionProxy,您可以将此对象视为数组,而不是哈希。

你最初是如何编写循环的,看起来你把它当作哈希:

@agent.sales.each do |agent, sale|&gt;这个语法是针对哈希中的每个键值对,使用键(agent)和值(sale)执行某些操作。

第二次尝试运行循环时,您需要在&#34;值&#34;上运行它。迭代器的一部分,它不存在,因此行sales.each do |sale|

上的错误

真的,你非常接近,但正在过度思考它。只需放下第一个迭代器并保留其余部分:

<tr>
  <td><% @agent.name %></td>
  <% @agent.sales.each do |s| %>
    <td><%= s.date %></td>
    <td><%= s.product %></td>
    <td><%= s.price %></td>
  <% end %>
</tr>

顺便说一句,您也可以应用相同的原则并重构标题:

<tr>
  <td>Name</td>
  <% 3.times do |n| %>
    <td>Date</td>
    <td>Product</td>
    <td>Price</td>
  <% end %>
</tr>

这假设您的约束是3个最大销售额。