【Ruby on Rails】undefined method `each' for nil:NilClassの原因と対応

環境:

Ruby 2.6.3

発生事象:

undefined method `each' for nil:NilClass

f:id:TMLabo:20200201132538p:plain

結論:

エラーが出たので探っていくと、コードの後ろに全角スペースがある。

恐怖の全角スペースエラー探しを、身をもって味わいました。

viewファイルがこちら:

h1.c-page_title 日記一覧

= link_to '日記の登録', new_diary_path, class: 'c-btn'

table.c-table
tbody.c-table__body
- @diaries.each do |diary|
tr.c-table__tr
td.c-table__td = link_to diary.title, diary, class: 'c-link'
td.c-table__td = diary.created_at

 

コントローラー:

class DiariesController < ApplicationController
 
def index
@diaries = Diary.all
end

def show
end

このindex の後ろに、全角スペースが隠れておりました。

 

過程:

エラーの意味は、undefined method `each' for nil:NilClass

 →つまり「each」メソッドがないから、そんなものは実行できない、という意味です。

 したがってここの @diaries  nil らしい。

 

次に@diariesというインスタンス変数は、コントローラで作成されている。

コントローラが怪しいが一見大丈夫。

 

スペルを何度もみても、間違えていない。

カーソルを合わせて一つ一つみていくと、、、

 

あれ、??スペース入っっとる。消してきれいにしよう。

と思い消すと、なんということでしょう!

輝かしいバグが消えました!(やったー!)

 

indexアクションはindex[全角スペース]で定義されてしまっていたので、

アクションで呼び出した時に、indexがないよ!となって、その結果htmlファイルを実行できない状態でした。(たぶん)

 

補足:

ちなみに @diaries = Diary.all の後ろだけに全角スペースが入った場合は、

こんな感じで別のエラーです。

f:id:TMLabo:20200201134816p:plain

undefined method `all ' for #<Class:0x00007fe88a13ae28> Did you mean? all

 

気をつけてください。