3

我的 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%。

有任何想法吗?

PS 这个问题与其他模型和属性断断续续地弹出......不仅仅是书籍和排名属性。

4

5 回答 5

2

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

return book.ranking unless book.nil?

应该解决这个问题。

于 2010-04-07T15:56:28.230 回答
1

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

检查是否

return book.ranking if book

使用&&/and

return book && book.ranking

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

return book.try(:ranking)
于 2010-04-08T07:51:07.283 回答
1

我会try在这里使用:

book.try(:ranking)

ifbookrankingis nilthennil将被退回。

于 2010-04-07T20:10:09.480 回答
0

你也可以这样做:

return book.ranking unless book and book.ranking

或使用andand宝石:

return book.ranking unless book.andand.ranking
于 2010-04-07T20:35:20.247 回答
0

你应该检查 book 是否为 nil

return book.ranking unless book.blank? and book.ranking.blank?
于 2010-04-07T16:30:29.387 回答