どうも、三町哲平です。
プログラミングをしていたら必ずエラーに出会す場面が出てきます。
簡単に解決できるエラーもあれば、何時間、下手したら数日掛かっても解決しないそんなやる気すら失ってしまうエラーも存在します。
そういうやる気を失ってしまう時に役立つエラーに使えるかも知れないテクニックを一つ紹介します。
尚、今回はRuby on Railsで発生したエラーですが、データベース絡みのエラーだとRails問わず、どのプログラミング言語での開発環境においても効果的です。
今回は、エラー発生から3日掛かって解決しましたので、短くわかりやすくまとめてみました。
まず、結論
この記事の概略を説明すると、
データベースが元の異常ぽかったら、データベースを再作成した方が早いよ。
ていう話。
では、3日間の闘いをどうぞ!
1日目. Template::Error
undefined method `image_name' for nil:NilClass
上記の文をピックアップしてfor nil:NilClassの部分を無視して考えた時に
__image_nameというメソッドが定義されていない__という意味です。
1. メソッドの定義忘れ
2. シンプルに誤字脱字
この辺りを疑い色々試してみましたが、
メソッドの定義悪でも、誤字脱字でもない...
ググってみても正解には辿り着けない...
とりあえず初日は疲れて寝てしまいました。
2日目. データベースっぽい
誤字脱字がないか再調査したが、問題なし。
ここで余り気に留めていなかった
for nil:NilClass
の部分についてググってみるようになります。
ちなみにRubyを使ったことない方は、
__nil__って何?となるかもしれませんが、
nilは、nullと同じ意味です。
つまり、__「何もない」__ということです。
何もないという内容で思い付くのは1つ...
__データベース絡みっぽいな__ということに
そして気付けば深夜1時、またすっかり日付が変わっていました。
3日目.ググり続けた結果
Ruby on Rails 5 - undefined method `image_name' for nil:NilClass といエラーがでています|teratail
上記のサイトに辿り着きました。
ここからは、引用が続きますが、
このやり取りが全てです。
文字多いし小さしで読みたくない方に向けて結論だけ簡単に要約すると、
原因はおおよそ掴めたけど、もうデータベースを作り替えた方がいいよね。
という話。
postsテーブルを作成してデータを複数入力
↓
nilの状態(何もない)のカラムを作成してはいけないルールに途中からプログラミングする
↓
新しいカラム(user_id)を作成する
↓
今までのuser_idカラムは全てnilの状態である
↓
エラー発生
さいごに
原因はデータベースに入れてはいけないデータが含まれている。それならばそのデータを削除すれば良い。
もしくは開発環境のデータベースで消しても問題ないのならば今回のように再作成すればそれで復旧できます。
仮にRuby on Railsの場合ですと、
$ rails db:drop # データベースを削除する
$ rails db:create # データベースを作成する
$ rails db:migrate # データベースにマイグレートする
これと同じようにあなたの開発環境にあったソースコードを入力したら、良い訳ですね^^
追記
ちなみにdb:drop → db:create → db:migrate をまとめて行うこともできます。
$ rails db:reset
※このコマンドでまとめて、dbの削除からマイグレートまでを行えます。