今回書くこと
バリデーションを、特定の条件下のみで発動させたい場合、どのような処理を記述すればいいか
環境
Ruby 2.6.5
Ruby on Rails 6.0.4.3
結論
on: :アクションを用いる
記述方法
モデル
class Article < ApplicationRecord
validates :title, presence: true, on: :create
validates :text, presence: true
end
titleにon: :createと記述されています。このオプションによって、このタイトルへのpresence: trueは、createアクションのみに適応されることになります。textのpresence: trueは、create, updateにかかっていることになります。
createをupdateに変えることもできます。
バリデーションのタイミングを変更したい場合、on: :createを指定すればレコード新規作成時にのみ検証が行われ、on: :updateを指定すればレコードの更新時にのみ検証が行われます。
とされています。
ちなみに、複数のバリデーションにまとめてオプションをつける時の記述は、このようにした方が可読性が高まるでしょう。
with_options on: :create do |create|
create.validates :title, presence: true
create.validates :text, presence: true
end
特定のバリデーションを、特定のタイミングで起動させたい。と思っている方の参考になればと思います。
浮かんだ疑問
今回のバリデーションとしてpresence: trueを例に出しましたが、実際に利用するときは、どんなバリデーションにこのオプションをかけるといいのかなと思いました。カスタムコンテキストなども踏まえ、この辺についてもう少し掘り下げたいですね。
最後に
最後まで読んでいただいた皆様、ありがとうございます。
ソースコード、記事の書き方について「もっとこうしたほうがいいよ!」というご意見、「そこどうなっているの?」というご質問など、お待ちしております。
参考文献
Active Record バリデーション
- https://railsguides.jp/active_record_validations.html
状況によってsave時に実行するバリデーションを切り替える
- https://qiita.com/kadoppe/items/061d137e6022fa099872