LoginSignup
504
440

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-04-25

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

便利。

504
440
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
504
440