nil值返回错误未定义方法`car_number'为nil:NilClass即使我用.nil检查它们?

时间:2016-03-15 09:18:37

标签: ruby-on-rails ruby ruby-on-rails-4

当我用数据手动替换nil值时,我没有错误。

<%  @visits.each do |f|  %>
<tr>
    <td><%=f.owner.car_number unless f.owner.car_number.nil?%></td>
    <td><%=f.owner.car_type unless f.owner.car_type.nil?%></td>
    <td><%=f.owner.car_year unless f.owner.car_year.nil?%></td>
    <td><%=f.owner.first_name unless f.owner.first_name.nil?%> <%=f.owner.last_name unless f.owner.last_name.nil?%></td>
    <td><%=f.owner.phone unless f.owner.phone.nil?%></td>
    <td style="direction:ltr"><%=f.created_at.strftime("%d/%m/%Y")%></td>
    <td>XX NOTES </td>
</tr>

3 个答案:

答案 0 :(得分:1)

我假设@visits包含有效的对象列表。

现在,让我们仔细阅读错误:

  

未定义的方法`car_number&#39;为零:NilClass

你在哪里申请car_number?提示:对象f.owner。含义f.ownernil,因此f.owner.car_number.nil仍然会出错。

将它们调整为:

<%= f.owner.car_number if f.owner %>

或更好:

<%  @visits.each do |f|  %>
  <tr>
    <% if f.owner %>
      <td><%=f.owner.car_number %></td>
      <td><%=f.owner.car_type %></td>
      <td><%=f.owner.car_year %></td>
      <td><%=f.owner.first_name %> <%=f.owner.last_name %></td>
      <td><%=f.owner.phone %></td>
      <td style="direction:ltr"><%=f.created_at.strftime("%d/%m/%Y")%></td>
      <td>XX NOTES </td>        
    <% end %>
  </tr> 

答案 1 :(得分:1)

最好还是需要添加验证以停止nil ownervisit中的输入,或者该关联已通过访问为所有者定义的模型

我在这里考虑visit model有一个owner

 class Visit < ActiveRecord::Base
     has_one :owner
     validates :owner, presence: true
 end

使用try

的其他解决方案
  <%  @visits.each do |f|  %>
  <tr>
    <% ["car_number", "car_type","car_year", "first_name", "last_name", "phone"].each do |meth| %>
      <td><%= f.try(:owner).send(meth) %></td>
    <% end %>
     <td style="direction:ltr"><%=f.created_at.strftime("%d/%m/%Y")%></td>
     <td>XX NOTES </td> 
  </tr>
  <% end %>

答案 2 :(得分:0)

检查第一次迭代。

而不是:

DateTime.Now

使用..

unless f.owner.car_number.nil?

或者您可以在迭代前先检查,例如:

unless f.owner.nil?