LoginSignup
0
0

More than 1 year has passed since last update.

エラー'NotNullViolation'

Last updated at Posted at 2021-09-14
  1. エラー内容
  2. 状況
  3. 原因
  4. 注意点

以前にも出くわした
エラーなのですが
解決法を忘れてしまったので
記録も兼ねて記事に書きます。

1.エラー内容

エラー内容は以下の通り。
Image from Gyazo

"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関連のエラーは
基本的にバリデーションなどの
データベースに関する処理になるので
その辺りを確認していくのが
原因を探り当てる近道になりそうでした。

今回は以上です。

お読みくださりありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0