2013-02-20 159 views
3

与协会(如Post belongs_to user)一个Rails应用程序,一个共同的例外是:在Ruby中,为什么堆栈跟踪中没有变量名?

NoMethodError: undefined method `user' for nil:NilClass 

无处不在,这使得初学者认为user为零。为什么我们不会有更直观的错误,比如下面的错误?

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

编辑:为什么这是downvoted?这个问题是合法的。我想知道是否有技术原因阻止这一点。

+2

他们一直都在倒退。没关系。 – texasbruce 2013-02-20 19:48:11

+2

我怀疑他们正在低估@CharlesOliverNutter在第一句话中所说的原因。这是一个非常明确的信息,“零没有称为'用户'的方法。”那加上行号告诉了我很多。如果我不能确定会导致什么变量,那么我将重构我的代码,使其更加明显,但通常它会是一个带有“.user”的代码。 – 2013-02-20 20:08:08

+1

我经常导师同时开始Ruby和Rails的人。我的理解是,很容易被不知所措,并且在某些事情不起作用时感到沮丧,并且在做一些更改并重新加载页面之前快速阅读'user'和'nil'。 :-(我们已经学会了注意行号等等,这个讨论可能有更好的地方,但我不确定在哪里。 – 2013-02-20 20:13:42

回答

7

首先,我不同意原来的说法。该消息清楚地表明,用户是未定义的方法,而不是变量或值。我不确定某人会如何认为用户是基于此消息的变量。

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