未定义的方法`name'为零:NilClass

时间:2014-04-16 13:39:41

标签: ruby-on-rails ruby

我在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的成员,是吗?

4 个答案:

答案 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