3

在具有关联(例如Post belongs_to user)的 rails 应用程序中,一个常见的例外是:

NoMethodError: undefined method `user' for nil:NilClass

无处不在,这使初学者相信这user是零。为什么我们没有更直观的错误,例如以下?

NoMethodError: `@post' is a nil:NilClass and doesn't have the method `user'

编辑:为什么这被否决了?这个问题是合法的。我想知道是否有技术原因阻止这种情况。

4

1 回答 1

7

首先,我不同意原来的说法。该消息清楚地表明 user 是未定义的方法,而不是变量或值。我不确定有人如何根据此消息认为 user 是一个变量。

但是,您的问题的答案是,在调用“用户”方法时,目标对象已经从引用它的任何变量中加载。调用“用户”的调用逻辑不知道该对象来自何处。它可能是一个局部变量、一个实例变量、一个常量……无法判断。此外,Rails 的“whiny nil”逻辑发生在 method_missing 实现中,远离对象的原始访问;原始变量查找的上下文甚至不再在范围内。

于 2013-02-20T19:48:59.740 回答