0

在 Rails 中处理 nil 错误的正确方法是什么?我经常收到如下错误:

NoMethodError(nil:NilClass 的未定义方法“问题”):

例如,假设我的应用中有章节,每个章节都有一个问题。我想从当前问题中调用上一章的问题,所以我在 question.rb 中编写了以下代码:

def previous_question
 self.chapter.previous.question
end

这可能会导致上述错误,所以我在模型中编写了一个方法来检查这是否会导致 nil 结果:

def has_previous_question?
 self.chapter and self.chapter.previous and self.chapter.previous.question
end

如果我确保在调用之前调用previous_question它,它可以工作,但它看起来很荒谬。有没有更好的方法来处理 Rails 中的 nil 错误?

4

3 回答 3

3

我不能说这是正确的方法,但这是处理这种情况的另一种方法:

def previous_question
  self.chapter.previous.try(:question)
end

这样就不会有任何错误,如果没有前一章,该方法将简单地返回nil

如果你想返回其他东西以防它实际上是 nil,你可以写:

def previous_question
  self.chapter.previous.try(:question) || returning_this_value_instead
end

旁注:您不需要在这种情况下使用 self :

def previous_question
  chapter.previous.try(:question) || returning_this_value_instead
end
于 2013-05-21T20:55:06.670 回答
1

我最喜欢的视图渲染方法之一:

http://apidock.com/rails/Object/try

于 2013-05-21T20:41:03.850 回答
0

Interesting approach is using nil objects, although they are not suitable for every situation...

于 2013-05-21T21:46:08.567 回答