NoMethodError (undefined method `id’ for nil:NilClass):の解消

※殴り書きです。

 

NoMethodError (undefined method `id’ for nil:NilClass):

railsをやっているとしょっちゅう出てくるのがこのエラーです。

アホほど見ました。

もうね、一番見たエラーメッセージと言っても過言では無いですよ。

 

そんなエラーの解消方法、というかその原因を記します。

 

①find_byを使っていることによるモノ。

私の場合ほぼこれでした。

find_byで見つからなかった場合、nilを返すことになっています。

ですので、DBにはしっかりと保存されているはずの値なのに、nilが返ってくるという謎現象が発生してしまうのです。

 

このエラーが発生した時にやることの流れは

①指定しているカラム名などが間違っている。

@user.idとすべきところを @usar.idとしていることがありますからね。

まぁ、これによるエラーの場合はNameErrorと表示されることが多いですけどね。

 

②引っ張り出そうとしている値はDBに保存されているのか?

次に疑問に思うのがこちらです。

idの場合は絶対に付与される値ですが、それ以外の場合にはこの可能性を考えますよね。

データがきちんと保存されているかどうかはDBを見れば分かります。

rails c

User.all

と入力して、探しているデータが存在するか見てください。

ここでデータが正しく保存されていない場合はデータの保存アクションに問題があったということになります。

 

③find_byで見つからなかった場合。

データベースを確認して、正しくデータが保存されているのにnilが返ってきているのはおかしい。

あるのに、無いと言われているんですよ。

生産が遅れているNintendo Switchを抱えた玩具屋さんですか?

ふざけるんじゃ無いよ!と言いたくなりますよね。

 

さて、引っ張ってくるモノ自体は存在するんだから、このfind_byがミスっているということになりますよね。

私がよく使うfind_byの場面では

find_by(id: params[:id])

を使います。

この時に書いている[:id]というのは、URLに記載することにしている値です。

これはよくある手法ですよね。

 

で、問題はそのidが見つからないということ。

原因として思い当たるのは、このidがおかしいことです。

この時にみるべきなのは、このidがどこから引っ張ってくる値なのかを再確認することです。

どこにidが書いているのでしょうか?

私の場合は汎用性の高いrootを使うことが多いので、idを指定しないURLを頻繁に使います。

ですので、それに伴ってアクションが「idってどれのことやねん!」と怒ることが多いのです。

これを解消してあげましょう。

しっかりとURLなどの分かりやすい部分にidを表記する。

または、そのアクションに直接値を渡す仕組みを作る。

この2つのどちらかをすれば良いですね。

 

書いたコードに間違いは無いのに問題がある、という。

初心者にとっては意味不明な現象ですが、コードで扱うべき値に問題があるパターンです。

 

例えるなら「ネジ穴にネジを入れて締める作業をしようとネジとドライバーを持ったけど、それだとムリだぞ!と怒られたようなものですね。必要なネジとドライバーは持っているのだけど、使うべきネジの大きさが間違っていたり、ドライバーの種類が間違っている」といった感じです。

道具などの種類はしっかりと理解しているし、用意できる。

だけど、そのネジ穴に適合するネジやドライバーの選択が正確に出来ていないのです。

これじゃあ、ムリだよね。

 

というイメージですかね。

初心者が何言っているんだ感はあると思いますが、私はそう感じたというところです。

 

nilだぞどうなってんだ!と言われた時は、DBと指定する値をしっかりと確認することが大切ですね。

うん、プログラムって融通効かないよねぇ!

だけど、それ故間違っているところ、曖昧なところはしっかりと指摘してくれる。

人間が如何に適当にコミュニケーションを取っているのかよく分かりますよね。

うん、本当に日本語って適当だと再認識する。

指示語とか、ふんわりとした言葉でも通じますしね。

そう考えると便利なんだけど、曖昧だから勘違いも発生してしまうんですよね。

 

どっちもどっち。

一長一短ですね。

私的には、もう少し日本語はプログラミング言語のようにしっかりとしたものになってもいいんじゃ無いかな、と思ったり。

コメント

タイトルとURLをコピーしました