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を複数指定したい時はどうするのか調べてみました。
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
コメントを残す