save
メソッドを呼び出してモデルのデータを保存するときに、状況によって実行するバリデーションを切り替えたい場合がある。
そんな時は、validates
メソッドのon
オプションが使える。
例えば、
validates :username, presence: true, on: :create
とすれば、モデルのデータを最初に永続化するときにだけ、バリデーションが実行されるようになるし、
validates :username, presence: true, on: :update
とすれば、モデルのデータを更新するときにだけ、バリデーションが実行されるようになる。
on
オプションには任意のシンボルを指定することができて、save
メソッドのcontext
オプションを呼び出し時に指定することで、自由に実行するバリデーションを切り替えることができる。
例えば、
validates :username, presence: true, on: :registration
としていた場合、
@user.save(context: :registration)
のような形でsave
メソッドを呼び出した時にだけ、バリデーションが実行される。
valid?
メソッドやinvalid?
メソッドで保存処理を行う前にデータのバリデーションを実行したい場合は、
@user.valid?(:registration)
のように、単に引数としてシンボルを渡すだけでよい。
ちなみに、以下のように複数のバリデーション定義に同じon
オプションを指定する場合、
validates :username, presence: true, on: :registration
validates :email, presence: true, on: :registration
with_options
メソッドを使って複数のバリデーション定義をひとつにまとめることができる。
こんな感じ。
with_options on: :registration do |registration|
registration.validates :username, presence: true
registration.validates :email, presence: true
end
便利。