检查是否存在Rails中的记录has_many

时间:2017-08-22 05:17:24

标签: ruby-on-rails

我的应用中有一个has_many through:关系people有很多occasionsgifts,反之亦然。

在模型中正确设置:

person.rb是这样的:

belongs_to :user
has_many :gifts
has_many :occasions, through: :gifts

occasion.rb是这样的:

belongs_to :user
has_many :gifts
has_many :people, through: :gifts

gift.rb是这样的:

belongs_to :user
belongs_to :person
belongs_to :occasion

在视图中,我尝试在y轴上创建一个people的表,在x轴上创建occasions,在相应的单元格中创建gifts。我在gifts#index视图中有这个:

<table>
    <tr>
            <th>Recipient</th>
        <% @occasions.each do |occasion| %>
            <th><%= occasion.name %></th>
        <% end %>
    </tr>
    <% @people.each do |person| %>
        <tr>
            <td>
                <a href="#edit-recipient-popup" class="open-popup-link">
                    <p><strong><%= person.name %></strong></p>
                </a>
            </td>
            <% @occasions.each do |occasion| %>
                <td>
                    <% if @gift.where(person_id: person.id, occasion_id: occasion.id) %>  <<<<<<THIS LINE IS THE ISSUE
                        <%= gift.name %>
                    <% else %>
                        <h1>
                            <%= link_to new_gift_path do %>
                                <i class="icon ion-ios-add green"></i>
                            <% end %> <!-- link -->
                        </h1>
                    <% end %> <!-- if/else end -->
                </td>
            <% end %> <!-- occasions each -->
        </tr>
    <% end %> <!-- people each -->
</table>

我的问题是,在指示的行上,我得到undefined method其中&#39;对于nil:视图中的NilClass . I assume this is because you can't use controller logic like where`,但我不确定如何对此进行说明。

任何人都可以帮助我成功完成这项任务,并且能够帮助我完成最重要的任务。方式是什么?

3 个答案:

答案 0 :(得分:1)

编辑:

搜索结果,如果有结果然后打印,这将防止出现nil值错误

  <% gift = Gift.where(person_id: person.id, occasion_id: occasion.id) %>
  <% gift != [] %>
      <%= gift.name %>
  <% else %>
      <h1>
          <%= link_to new_gift_path do %>
              <i class="icon ion-ios-add green"></i>
          <% end %> <!-- link -->
      </h1>
  <% end %>

答案 1 :(得分:0)

<% if @occasions.gifts && @occasions.gifts.where(person_id: person.id) %> 

答案 2 :(得分:0)

  

我认为这是因为你不能在视图中使用像wherewhere那样的控制器逻辑

这不是问题,首先where不是控制器逻辑,它是模型逻辑,第二,它只是在模型上调用,它不重要在哪里,它可以可以从代码库中的任何位置调用,只要它在模型上。

就你的错误而言,你得到它是因为@gift实例变量没有设置,它是nil,你在调用它之前在任何地方设置这个变量吗?

在街区:

<% if @gift.where(person_id: person.id, occasion_id: occasion.id) %>  <<<<<<THIS LINE IS THE ISSUE
    <%= gift.name %>
<% else %>
    <h1>
        <%= link_to new_gift_path do %>
            <i class="icon ion-ios-add green"></i>
        <% end %> <!-- link -->
    </h1>
<% end %>

您的第一个问题是,如上所述,@gift变量为nil,其次,当您编写gift时,您正在另一个未设置的局部变量<%= gift.name %>上调用名称。

我认为你正在追求

的内容
<% gift = occasion.gifts.find_by(person_id: person.id) %>
<% if gift.present? %>
    <%= gift.name %>
<% else %>
    ....
<% end %>

您可能已经注意到我已将.where更改为.find_by,这是因为&#39; .where&#39;将返回一个集合,在查看您的代码时,您希望显示一个礼品记录的名称。