【问题标题】:Undefined method `assessment' for nil:NilClassnil:NilClass 的未定义方法“评估”
【发布时间】:2017-12-04 00:31:02
【问题描述】:

我收到以下错误:

undefined method `assessment' for nil:NilClass

我下面的代码有条件,除非该方法为 nil 时排除,但不工作。我也尝试过 if 条件,但无济于事。

如果评估为零,我想我需要默认一个数字,但不确定如何做到这一点。

日期以毫秒为单位:1482985235000

<% @sales.methods.each do |data| %>
  <%= Time.at(data.assessment.assessment_date/1000).strftime("%d/%m/%Y") unless data.assessment.assessment_date.nil? %>
<% end %>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5


    【解决方案1】:

    尝试使用安全导航运算符或进行一系列尝试。

    data.try(:assessment).try(:assessment_date).nil?

    或者通过使用安全导航操作符。

    data&amp;.assessment&amp;.assessment_date.nil?

    在 nil 上调用任何方法时都会产生此错误。如果 data 为 nil,则评估将产生错误,如果评估为 nil,则assessment_date 将产生错误。无论哪种方式,您都需要确保两者都存在。
    我们通常不使用内联救援,而是通过检查两个对象来处理此类场景。您可以选择任何选项,也可以查看data.assessment.present? &amp;&amp; data.assessment.assessment_date.present?

    【讨论】:

      【解决方案2】:

      错误表明你在 nil 上调用方法 assessment...这意味着 nil 是 data。您的条件是检查data.assessment.assessment_date 是否为零...但它甚至不会检查assessment_date 是否为零,因为它已经在data.assessment 失败了

      【讨论】:

      • 对。现在从条件中删除assessment_date给了我:nil:NilClass的未定义方法`/'
      • 我猜是因为它是 nil,它不能做除法。
      • 是的。 nil? 不会一直检查消息传递堆栈,它只检查堆栈中的最后一件事 - 您必须像 @Manishh 使用 try 或安全导航的示例一样检查每个级别
      【解决方案3】:

      我找到了解决问题的方法。不确定这是否是最好的方法,但它确实有效。我在通话末尾添加了rescue 0

      <% @sales.methods.each do |data| %>
        <%= Time.at(data.assessment.assessment_date/1000).strftime("%d/%m/%Y") rescue 0 %>
      <% end %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-27
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多