Rails

状況によってsave時に実行するバリデーションを切り替える

More than 5 years have passed since last update.

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

便利。