Railsのvalidationで複数contextを指定する方法

f:id:ihatov08:20170314105523j:plain

validationにcontextを指定しておくと、vaidationを切り替えることができます。
例えば、ユーザー作成時とユーザープロフィール変更時にvalidationを切り替えたい時などに使えます。

  with_options on: :registrations_new do |new_record|
new_record.validates :email, confirmation: true
new_record.validates :password, confirmation: true
new_record.validates :first_name, presence: true
new_record.validates :last_name, presence: true
end

controllerでsave(context: :registrations_new)のように呼び出すことで指定したcontextのみのvalidationを走らせられます。

今回contextを複数指定したい時はどうするのか調べてみました。

blog.bigbinary.com

Rails4まで

Rails4まではvalid?の引数にcontextを与えることで、複数のcontextをチェックするメソッドを作成することができます。

class MultiStepForm < ActiveRecord::Base
#...
def save_personal_info
self.save if self.valid?(:personal_submission)
end
def save_education
self.save if self.valid?(:personal_submission)
&& self.valid?(:education_submission)
end
def save_work_experience
self.save if self.valid?(:personal_submission)
&& self.valid?(:education_submission)
&& self.valid?(:work_ex_submission)
end
# And so on...
end

Rails5から

Rails5からはvalid?の引数にArrayを取れるようになりました。
Rails4までの時のように&&で繋げる形で記述すると、最後に評価されたcontextのみvalidationが走るようなので
注意が必要です。

class MultiStepForm < ActiveRecord::Base
#...
def save_personal_info
self.save if self.valid?(:personal_submission)
end
def save_education
self.save if self.valid?([:personal_submission,
:education_submission])
end
def save_work_experience
self.save if self.valid?([:personal_submission,
:education_submission,
:work_ex_submission])
end
end

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です