我在te line上遇到了这个问题
<td><%= h box.manufacturer.name %></td>
的
<% @boxes.each do |box| %>
<tr>
<td><%= h box.manufacturer.name %></td>
<td><%= h box.model %></td>
<td><%= link_to 'Mostrar', :action => 'show', :id => box %></td>
<td><%= link_to 'Editar', :action => 'edit', :id => box %></td>
<td><%= button_to 'Eliminar', { :action => 'destroy', :id => box },
:confirm => "Are you sure you want to delete box #{box.model}?" %></td>
制造商是一个名为name的字段的表,它假设一个对象制造商有名为name的成员,是吗?
答案 0 :(得分:4)
很明显,您的box
条记录之一没有关联的manufacturer
。如果可以接受,您可以使用Object#try
方法,如下所示:
<%= box.manufacturer.try(:name) %>
如果不是,您应该考虑为Box
模型添加适当的验证:
validates_presence_of :manufacturer
我没有使用h
帮助器,因为在Rails&gt; = 3.0(您可能使用)中,不受信任的内容会自动转义。
答案 1 :(得分:2)
这意味着您的一个盒子没有制造商。
您可以使用try:
阻止此类异常box.try(:manufacturer).try(:name)
如果制造商不存在,它将返回nil而不是抛出异常
答案 2 :(得分:1)
是的,但在你的情况下,你似乎有一个没有制造商的盒子。
<%= h box.manufacturer.name if box.manufacturer %>
或者
<%= h box.manufacturer.try(:name) %>
答案 3 :(得分:1)
建议的解决方案解决了这个问题,但没有解决架构中的错误。我建议学习Tell Don't Ask原则。 您的意见不应该对nil进行任何检查,因为这不是他们的责任。您应该始终尝试避免使用长方法链,因为它在某些步骤中始终会失败。
重构您的应用程序:
<强> box.rb:强>
def manufacturer_name
manufacturer.try(:name)
end
查看:强>
<td><%= h box.manufacturer_name %></td>
如果盒子没有,我认为不可能。如果是 - 那么我建议从数组中删除nils,然后在这样的视图中迭代它:
<强>控制器:强>
@boxes = box_retrieving_method_with_nils.compact