- エラー内容
- 状況
- 原因
- 注意点
以前にも出くわした
エラーなのですが
解決法を忘れてしまったので
記録も兼ねて記事に書きます。
1.エラー内容
"ActiveRecord::NotNullViolation in Users::RegistrationsController#create_as_leader"
"Mysql2::Error: Field 'compose_style_id' doesn't have a default value"
2.状況
今回は
初歩的なケースなのでコードを割愛します。
ウィザード形式で追加した二ページ目で
sessionに保存していたデータごとsaveしようとしたところ
エラーが出てしまう、という状態。
エラー文によるとcompose_style_idカラムがエラーを起こしており
このカラムについてはアクティブハッシュを利用しています。
3.原因
正解から書いてしまうと
エラーの原因は
バリデーションとストロングパラメーターの
スペルミスでした。
(他に同じエラーの原因として考えられるのは
・password等、deviseにデフォルトである値をマイグレーションファイルで書き足してしまい、重複しているケース
・Nullになってはいけない箇所がnullになっているケース
...等々のようです。)
4.注意点
原因を探し当てるのに一つの障害となるのは
バリデーションそのものは正常に作動して見えることです。
以下、binding.pryで原因調査時のコード。
22: def create_as_leader
23: @user = User.new(session["devise.regist_data"]["user"])
24: @as_leader = AsLeader.new(as_leader_params)
25: unless @as_leader.valid?
26: render :new_as_leader and return
27: end
28: @user.build_as_leader(@as_leader.attributes)
=> 29: binding.pry
30: @user.save
31: session["devise.regist_data"]["user"].clear
32: sign_in(:user, @user)
33: end
[1] pry(#<Users::RegistrationsController>)> @user.valid?
User Exists? (0.2ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 's@s.s' LIMIT 1
↳ (pry):1:in `create_as_leader'
=> true
trueで返されてしまっています。
おそらくデータそのものは
バリデーションによって止められていないからと思われ、
逆の考え方をすると
バリデーションのfalseは
paramsの通過可否の確認しかできず
バリデーションそのものの記述の正しさを反映しません。
また、mysql関連のエラーは
基本的にバリデーションなどの
データベースに関する処理になるので
その辺りを確認していくのが
原因を探り当てる近道になりそうでした。
今回は以上です。
お読みくださりありがとうございました。