数時間解決できなかったので備忘録として書きます。
前提:
・Rails5
・accepts_nested_attributes_for でネストしている画像なども一緒に保存・更新する様に記述している
・carrierwaveを使っている
・NotNullViolation(Mysql2::Error: Column 'image' cannnot be null: INSERT INTO~~~)
というエラー文が出ていてVALUESには確かにNULLって書いてある
・paramsが以下の様に出ていてインスタンスになっていない
parameters: {(省略)"3"=>{"image"=>"C:\\fakepath\\〇〇〇〇.jpg"}
そして画像が保存できない!
何が起きてるの?:
上記の状態は画像の名前部分(しかもセキュリティ上の問題でfakepathという仮のパス!)しか取得していないという状態です。
欲しい部分(画像のデータとなるところなどなど)が無いのでNULL扱いなんだと思います。
https://qiita.com/shizuma/items/6f56ca442111ece021b5
上記のものすごく有難い記事の様に f.fields_for を使っていてそのスコープ内であれば起きない現象です。
なぜなら multipart: trueというオプションが記載なしで実行されているからです。
このオプションの無い場合は、画像の名前しか得てくれないんですね。今回の問題はこれです。
form_tagで画像を受ける場合は必須の様です。
javascriptなどでフォームを後から追加する仕様にしていたため、私は記載がなく引っかかりました
対処法:
form 部分に multipart: trueのオプションを加えるだけです。