undefined method `〇〇' for nil:NilClassとは何?
このエラーは一体何?
これはnilのオブジェクトに対して〇〇メソッドを呼び出そうとしているエラーです。
オブジェクトがnilなのにメソッドを呼び出したところでエラーになってしまうのは当然ですよね。
具体的にどんな時?(簡単に説明)
例えば以下のコードがあるとします。
user = nil
user.name # ここでエラーが発生する可能性があります
すごい簡単ですが、こんな感じです。userがnilだとnameメソッドを呼び出しても、
undefined method 'name' for nil:NilClass
のエラーが出てきます。
どう対処すればいいのか
まずは何がnilなのかを特定する必要があります。
上のnameを例にするとundefinedと怒られているメソッドのレシーバを
特定することから始まります。レシーバ(receiver)とはバレーボールとかのレシーバーと
一緒で受け取るって意味ですね。つまりこれはnameメソッドの実行対象です。
今回はnameを実行する対象はemployeeとしましょう!
この場合だとemployeeがnilになっていて、かつnilクラスの中にnameメソッドは定義されていないからエラーが発生した、ということになります。
実際の案件で対処した方法
実際に案件で対処した方法です。RSpecでとある機能のテストをしていました。
# bundle exec rspec
An error occurred while loading ./spec/controllers/〇〇.rb.
Failure/Error: require_relative '../config/environment'
NoMethodError:
undefined method `〇〇' for nil:NilClass
origins ENV['🔼'].〇〇(',')
今回の場合はnilのオブジェクトに対して〇〇メソッドを呼び出そうとしているエラーでした。
実際はテストの環境のtest.envが用意されていないのにRSpecでテストを実行しようとしていたのが原因でした。
開発環境ではちゃんと実行できるのになぜかテスト環境ではnilでした。このことからtest.env(テスト環境)を作成して
実行したら無事テストが通りました。
⚫︎ちなみに
Railsコンソールで開発環境とテスト環境の入り方を教えます。
# rails c #開発環境
# rails c -e test #テスト環境
これらは知っておいてください。
注意
現場や個人の状況によって発生するエラーは変わってくるので注意してください。
あくまで一例です。
資料
Discussion