ユーザー新規登録時に、ActiveRecord::NotNullViolation というエラーが出たのとそれに対処した話。


ユーザー新規登録におけるエラー

ユーザー管理機能を実装中に下記のエラーが出ました。

白抜きのエラーについて

ActiveRecord::NotNullViolation in Devise::RegistrationsController#create

参考のサイトで調べてみると

「このエラーはDB制約上、NULL にしてはいけない項目が NULL のまま保存が実行されたことによるエラー」

とありました。

確認したこと

①マイグレーションファイル

上記の画像エラー文に

Mysql2::Error: Field 'prefecture_address' doesn't have a default value

とあったため、これを確認するためにマイグレーションファイルを確認しました。
画像をご覧ください。

マイグレーションファイルでそのように設定しているのでここは特に問題なさそうです。

②コントローラー

マイグレーションファイルで設定しているのなら、受け手が受けてないのではないかと思い、次はコントローラーを確認します。

こちらもマイグレーションファイルで指定した通りのカラム名になっていました。

③ビュー

マイグレーション、コントローラーできたのでビューを確認してみようかなとなりました。(ここで若干焦り出します。)
ビューの画像が下記の通りです。
わかりましたでしょうか…
マイグレーションファイル、コントローラーではprefecture_addressとなっていたのが、ビューファイルではprefecuture_addressとなっていたのです。

コードの修正

ビューの修正を終えて新規登録を行ったところ無事登録ができておりました。

最後に

基本的にエラーが出たときにNoRouteMatches程度で焦る筆者(一応NoRouteMatchesは克服したつもり)ですので、今までみたことのないエラーが出たときは「ああ…終わった…」と思いました。今回の場合sourceのコードがどこのファイルのことを指しているのかがわからなかったので焦りようは半端なかったです。

エラーを調べてみて、サイトでヒットしたのは幸運でした。
これを機会にエラー耐性をつけていこうと思います。
失礼します。

参考文献

【teratail】
devise機能を導入してログイン・新規作成時のエラー
https://teratail.com/questions/235508