技術

[ Rails ]ActiveRecord::RecordInvalidで怒られ、saveができない!

投稿日:

こんにちは。たなかです。

新しいプロジェクトの参画が決まって、今は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が悪さしてるのか?」とか「書き方ミスってるのかな?」とか、不要な方向への調査に時間を取られ、無駄に時間がかかってしまいました。

本当に悪さしてるのはどこなのか、ちゃんと切り分けて丁寧に解決せねばですね。戒めねば。

今回はここまで。

参考サイト

-技術
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

wgetコマンドで指定のサイトをダウンロードしてみる。

wgetコマンドって? 下記の形式のコマンドを叩くと、指定のURLからファイルを …

[ Ionic ] A problem occurred evaluating project ‘:app’. > Failed to apply plugin [class ‘com.google.gms.googleservices.GoogleServicesPlugin’] > For input string: “+”

こんにちは。たなかです。 相変わらずモバイルアプリ開発やっています。 先日、Io …

画像生成マシーン「MakeGirlsMoe」の10連結果

女の子の萌え画像を作ってくれる「MakeGirlsMoe」なるものが作られたよう …

no image

AWS CLIでInvalidSignatureException Error

ECRにイメージをpushするために、dockerログインしようとして遭遇しまし …

[Angular] has no exported member ‘XXXLoginComponent’.

どうも中田です Angularでコンポーネント名を階層構造にあった名前にしようと …