我有一个典型的模型设置,其Parent
模型有很多Images
。 Image
belongs_to Parent
。
Image
有一个caption
列。
我有一个视图,我通过Parent
模型为每个循环执行标准,我想像这样拉出一个随机Image
:
<% @parent.each.with_index do |nut, index| %>
<h4><%= parent.name %></h4>
<p><%= parent.images.limit(1).order("RANDOM()").first.caption %></p>
<% end %>
在控制台中它可以正常工作。在视图中,它会抛出undefined method "caption" for nil:NilClass
首先我将其添加到Parent
模型中:
def random_caption
self.images.limit(1).order("RANDOM()").first
end
并使用:
<%= parent.random_caption.caption %>
甚至:
<%= parent.images.first.caption %>
这会导致同样的错误。我想我错过了Active Record的一些奇怪的细微差别或者不太明显的东西。
修改
也很奇怪 - 改为:
<%= parent.images.first %>
并且在视图中我得到了#<Image:0x007fd8f7404430>
,所以看起来那里有一条记录。
答案 0 :(得分:2)
必须有一些父记录没有任何图像。这就是你得到错误的原因。
在parent.images.limit(1).order("RANDOM()")
您有记录之前,下面的行不会给出任何错误。它将返回对象数组或[]
。因此,最好在此随机之前检查空白图像的条件。
parent.images.limit(1).order("RANDOM()").first.caption
因此,请尝试更改您的代码:
<% @parent.each.with_index do |parent, index| %>
<h4><%= parent.name %></h4>
<% if parent.images.present? %>
<p><%= parent.images.limit(1).order("RANDOM()").first.caption %></p>
<% else%>
<p>No image there</p>
<%end %>
<% end %>
答案 1 :(得分:0)
在您的数据库中,您有该父母的任何图像吗?