我的应用中有一个has_many through:
关系people
有很多occasions
到gifts
,反之亦然。
在模型中正确设置:
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`,但我不确定如何对此进行说明。
任何人都可以帮助我成功完成这项任务,并且能够帮助我完成最重要的任务。方式是什么?
答案 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;将返回一个集合,在查看您的代码时,您希望显示一个礼品记录的名称。