2013-02-20 391 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實現中發生,遠離對象的原始訪問;原始變量查找的上下文甚至不在範圍內。