【问题标题】:What's causing "NoMethodError: undefined method `include?' for nil:NilClass"是什么导致“NoMethodError:未定义的方法‘包括?’对于零:NilClass”
【发布时间】:2011-02-05 08:01:55
【问题描述】:

我的 Rails 应用程序中有一个 Book 模型,具有各种属性(也就是 book db 表中的列)。这些属性之一是“排名”。

最近may app已经开始抛出NoMethodError: undefined method 'include?' for nil:NilClass以下代码:

def some_method(book, another_arg)
  return book.ranking unless book.ranking.blank?
  ...
end

但是,它并不一致。绝大多数情况下,访问 book.ranking 是有效的——错误可能会在 2-4% 的时间内被抛出。如果我将代码更改为 book[:ranking]book['ranking'] 而不是 book.ranking,则它的工作时间为 100%。

有什么想法吗?

附:其他模型和属性会间歇性地出现此问题...不仅仅是 Book 和排名属性。

【问题讨论】:

  • 在重新加载应用程序后有时会在控制台中发生这种情况。我曾经弄清楚它来自哪里,但我忘记了。在 Rails 代码深处的某个地方。我想可能和mysql接口有关,你用的是mysql吗?
  • 我正在使用 PostgreSQL,我的应用在 Heroku 上运行。当我远程登录 Heroku 的控制台时,这个错误一直弹出(但从不在我的本地控制台上)。
  • 我知道这现在真的很老了,但我赞成,因为我看到与检查.nil? 而不是.blank? 的方法有关的相同错误。它不会始终如一地发生,并且相同代码的第二次运行或页面刷新似乎总是返回到预期的行为。这只是在我将开发环境从 SQLite3 切换到 MySQL 以更接近地模仿生产环境时才开始发生的,所以我倾向于同意@mckeed。

标签: ruby-on-rails ruby model methods undefined


【解决方案1】:

book 对象是 nil,不是排名的对象。所以有

return book.ranking unless book.nil?

应该可以解决问题。

【讨论】:

  • 如果是这样,错误不应该是NoMethodError: undefined method ranking' for nil:NilClass`?
  • 好点,我想我错了。我在看github.com/rails/rails/blob/2-3-stable/activerecord/lib/…,method_missing(当你调用你的排名方法时调用)似乎调用了include?在@attributes 上。也许由于某种原因这为零?
  • 我遇到了这个问题:这与该线程上许多人所说的对象为 nil 无关,但它在 rails 内部出了问题。 “question.id”导致 nil.include?错误但“问题[:id]”工作正常。我认为这与 Rob 建议的 @attributes 相关,但我无法确定。向记录器输出“question.attributes”似乎返回了完全正常的结果。
【解决方案2】:

我会在这里使用try

book.try(:ranking)

如果bookrankingnil,则将返回nil

【讨论】:

  • 尝试工作,但它不在 Ruby 1.8 中...您必须使用 Active Support 才能在 1.8 中获得它
  • @severin:鉴于这是一个 Rails 问题,我假设他们已经使用了 Active Support。
【解决方案3】:

有几种方法可以防止 nil 调用:

检查如果

return book.ranking if book

使用&&/and

return book && book.ranking

使用 try(在 Ruby 1.9 或 Rails/ActiveSupport 中):

return book.try(:ranking)

【讨论】:

    【解决方案4】:

    你也应该检查 book 是否为 nil

    return book.ranking unless book.blank? and book.ranking.blank?
    

    【讨论】:

      【解决方案5】:

      你也可以这样做:

      return book.ranking unless book and book.ranking
      

      andandgem:

      return book.ranking unless book.andand.ranking
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多