こんにちは。たなかです。
新しいプロジェクトの参画が決まって、今はrailsを書く時間が増えてきました。
フォームに情報を入力してsubmitするとDBに保存される、みたいなよくあるページを作成していたのですが、以下の症状で若干詰まったので備忘録的にメモです。
症状
入力フォーム画面から必要な情報を入れてsubmitし、createアクションに入るものの、DBにデータが保存されません。
(byebug) (4.0ms) BEGIN ↳ app/controllers/xxx.rb:36 (1.6ms) ROLLBACK ↳ app/controllers/xxx.rb:36 Redirected to http://localhost:3000/aaa Completed 302 Found in 5456ms (ActiveRecord: 5.6ms)
createアクション内でbyebugを仕込み、paramsを確認するものの被疑者っぽいものも無し。
別にvalidateもかけていないのですが、いざsaveしようとするとすぐにrollbackしてしまいます……なんでや!
解決方法
Modelのbelongs_toに 『optional: true』をつける!
Rails5からは、belongs_to関連はデフォルトで『required:true』になるため、required: falseにしたい時はoptional: trueを追記してやる必要があるとのこと。
nilがOKのケースの方が珍しいってことでデフォルトでnil不可になり、「nil許可したければ明示的にmodelに記載してねー」ってスタイルに変更されたみたいっすね。
ってな具合で使ってるモデルにoptional: trueを追記してやりました。
belongs_to :user, optional: true belongs_to :service, optional: true
無事DBへの保存ができましたー!やったぜ!
まとめ
今回の症状発生と同じタイミングでたまたまfields_forを使った関連テーブルへの一括保存ロジックも触っていたため、「paramsが悪さしてるのか?」とか「書き方ミスってるのかな?」とか、不要な方向への調査に時間を取られ、無駄に時間がかかってしまいました。
本当に悪さしてるのはどこなのか、ちゃんと切り分けて丁寧に解決せねばですね。戒めねば。
今回はここまで。