我的Rails应用程序中有一个Book模型,具有各种属性(在本书db表中也称为列)。其中一个属性是“排名”。
最近,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%有效。
有什么想法吗?
P.S。这个问题已经与其他模型和属性间歇性地出现......不仅仅是Book和排名属性。
答案 0 :(得分:2)
书籍对象是零,而不是排名。所以有
return book.ranking unless book.nil?
应该解决问题。
答案 1 :(得分:1)
我会在这里使用try
:
book.try(:ranking)
如果book
或ranking
为nil
,则会返回nil
。
答案 2 :(得分:1)
有几种方法可以防止来自nil-calls:
使用检查:
return book.ranking if book
使用&& /和:
return book && book.ranking
使用尝试(在Ruby 1.9中或使用Rails / ActiveSupport):
return book.try(:ranking)
答案 3 :(得分:0)
你应该检查书是否为零
return book.ranking unless book.blank? and book.ranking.blank?
答案 4 :(得分:0)
你也可以这样做:
return book.ranking unless book and book.ranking
或使用andand
gem:
return book.ranking unless book.andand.ranking