🌒

Form Objectのバリデーションについて

2020/12/05に公開

疑問点

Form Objectを使っていないときは、saveをif文の条件にするとちゃんとエラーを出せたのに、
Form Objectを使ったときはifの条件にsaveを使ってもエラーを吐かない。

いつバリデーションしてるの?

そもそもいつバリデーションされているのか、あまり考えていなかったので調べてみました。

以下のメソッドではバリデーションがトリガされ、オブジェクトが有効な場合にのみデータベースに保存されます、ということでした。

https://railsguides.jp/active_record_validations.html

  • create
  • create!
  • save
  • save!
  • update
  • update!

あれ?おかしくない?

saveでバリデーションしてるなら、Form Objectを使ってるときでもvalid?使わなくてもエラーを吐いてくれるはずじゃないか?
と思い、if文の条件式をsaveでしたものとvalid?にしたもので試して中身を確認したところ...

エラーが出てませんでしたー

なぜかsaveしてもバリデーションされてないという。。

結論

つまり、Form Objectを使っている場合はsaveをしてもバリデーションのトリガとならないということだと知りました。(なんでやねん)

また、いくつかの記事を見た感じ、Form Objectの中にあるsaveの中にif invalid?を入れることが多いみたいでした。(確かにソッチのほうがスマートだ...)

とりあえず今日はここまで!

Discussion