はじめに
Railsアプリ作成中、belongs_to
で関連付けたモデルのデータ保存がうまくいかず、はじかれてしまったので解決した方法です。
しょうもないミスでした
この記事が役に立つ方
-
belongs_to
で関連付けはしたが、うまく保存が出来ない方
この記事のメリット
- 無事にデータが保存出来るようになる。
環境
- macOS Catalina 10.15.1
- zsh: 5.7.1
- Ruby: 2.6.5
- Rails: 5.2.3
エラー内容
1対多の関係にある、UserモデルとRecordモデルがあるとします。
Recordテーブルのデータを新規作成し、save!
でデータ保存しようとしたところ、以下のようなエラーが発生。
ActiveRecord::RecordInvalid: Validation failed: Users must exist
保存するデータには外部キーuser_id
があり、そこにはちゃんと値が入っていて、「あれ?なんで?」と困る。
このときのモデルは以下のように定義していました。
class Record < ApplicationRecord
belongs_to :users
end
ここから応急処置(間違った解決法)とちゃんとした解決法を記載します。
1.応急処置(間違った解決法)
以下のように変更。
【Before】
class Record < ApplicationRecord
belongs_to :users
end
↓
【After】
class Record < ApplicationRecord
belongs_to :users, optional: true
end
optional: true
で関連モデルなしでOK!と放し飼い状態にし、一旦。バリデーションを回避。
しかし、全く意味のない矛盾した設定になるのであくまでも応急処置。
割とググるとこの解決法が多かったですが、あまり良くないと思います。
2.解決(ただの設定ミス)
【Before】
class Record < ApplicationRecord
belongs_to :users, optional: true
end
↓
【After】
class Record < ApplicationRecord
belongs_to :user
end
複数形
単数形
belongs_to関連付けで指定するモデル名は必ず「単数形」にしなければなりません。
Rails ガイドにもちゃんと書いてました!
英語で考えたら当たり前、お恥ずかしいです
optional: true
も不要なので削除。
これで問題なし!
おわりに
最後まで読んで頂きありがとうございました
しょうもない設定ミスで時間をロスしてしまったので、同じようなエラーで困っている方がいれば参考にして頂ければと思います