こんなエラーよく出ませんか?
こういうエラーが出て、「そうか、”length” ってメソッドが無いのか。他の方法をググってみよう」と初心者の頃は考えがちですよね。
そして調べてみても、”length” というメソッド自体は存在しており、不正な記述でもないので、意味不明になってしまうんですね。
“undefined method” は “for” の次がミソ
プログラミングを学習していると、「エラー文をよく読みましょう」というアドバイスを受けますよね。
自分では読んでいるつもりでも、そもそも英語よくわかんないし。。意味不明な単語とか出てくるし。。って感じだと思います。(僕もそうでした。。)
上の画像のエラーは “undefined method” で、このエラーの読み方は “for” の後に記載されている “nil:NilClass” が重要なんです。
やりがちなエラーの解釈
初心者のうちは、”length” がそもそも存在しないと誤解してしまって、Railsとの齟齬が生じてしまっているケースが多いです。
以下のような感じですね。
- 誤:「”length” が使えない。変数の型とかが悪い? “NilClass” はよくわからないので無視。」
- 正:「”nil” の変数に対して “length” メソッドを使おうとしている。変数が “nil” となってる原因を調査する必要がある。」
“nil:NilClass” とは
この場合、”length” が “NilClass” に対してダメだよ、と言われているので、“length” を使おうとしている変数の “str” が “NilClass” ということになります。
つまり、”str” の変数が NULL になってしまっているんです!
このケースは変数でしたが、渡されていない “params” に対して色々なメソッドを使おうとしても同じエラーが起きるケースはやりがちなので、気をつけましょう。
エラーの解消
ではここから、”undefined method” を解決していく手順を解説していきます。
①変数がNULLとなる原因を探す
上の画像では、5行目でエラーとなり、“str” の変数がNULLになっていることが原因とわかりました。
ではこの “str” はなぜNULLになってしまうのか、を考えます。
すると4行目に、
str = nil
の記述がありますね。
ここで変数を強制的にNULLにしていたので、空っぽの変数に対して “length”(文字列の長さを取得) が使えずにエラーとなってたんですね。
②変数がNULLにならないように対処する
原因がわかったので、次にコードを編集してエラーを解消していきます。
今回のケースでは変数を強制的にNULLにする行を入れていたので、単純にこれを消します。
そして、”length” が正常に動作するかの確認として、コンソール(ターミナル)画面に “length” の結果を出力するコードを入れ込みます。
p srt.length
編集後のコードはこんな感じです。
これで top のルートにアクセスして、プログラムを動かしてみましょう。
動かすと、コンソールで以下のようになり、赤ラインで示してあるように “length” が正常に動作して、”あいうえお” の文字列の長さを表示できています。
まとめ
エラー文も初見ではよくわからず理解するのが困難かもしれませんが、いちど性質を理解してしまえば、エラーが出るたびにググる必要がなくなります。
今回のは “undefined method xxx for nil:NilClass” でしたので、理解するのも難しくなかったかもしれません。
初心者のうちは、色々なエラーを経験して傾向を掴んでいく道を通らなくてはいけません。
解決するためだけにググるよりも、エラー文を理解して対処できる力を身につければ、苦しい道も短くなります。
最初は心が折れそうになりますが、ぜひ頑張って進んで次の景色を見れると面白いですよ!
コメント