地方でリモートワーク

プログラミング、先物、fx,仮想通貨なんでもやります

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