3

アソシエーション(など)を持つRailsアプリでPost belongs_to userは、一般的な例外は次のとおりです。

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

まず第一に、私は元の主張に同意しません。メッセージは、ユーザーが変数や値ではなく、未定義のメソッドであることを明確に示しています。このメッセージに基づいて、ユーザーが変数であると誰かがどのように考えることができるかわかりません。

ただし、あなたの質問に対する答えは、「ユーザー」メソッドが呼び出されるまでに、ターゲットオブジェクトは、それを参照する変数からすでにロードされているということです。「ユーザー」を呼び出すための呼び出しロジックは、そのオブジェクトがどこから来たのかについて何も知りません。ローカル変数、インスタンス変数、定数である可能性があります...見分ける方法はありません。また、Rails の "whiny nil" ロジックは、オブジェクトの元のアクセスから遠く離れた method_missing 実装で発生します。元の変数ルックアップのコンテキストは、スコープ内にさえありません。

于 2013-02-20T19:48:59.740 に答える