123456789_123456789_123456789_123456789_123456789_

Module: ActiveModel::Validations::Callbacks::ClassMethods

Relationships & Source Files
Defined in: activemodel/lib/active_model/validations/callbacks.rb

Instance Method Summary

Instance Method Details

#after_validation(*args, &block)

Defines a callback that will get called right after validation.

class Person
  include ActiveModel::Validations
  include ActiveModel::Validations::Callbacks

  attr_accessor :name, :status

  validates_presence_of :name

  after_validation :set_status

  private
    def set_status
      self.status = errors.empty?
    end
end

person = Person.new
person.name = ''
person.valid? # => false
person.status # => false
person.name = 'bob'
person.valid? # => true
person.status # => true
[ GitHub ]

  
# File 'activemodel/lib/active_model/validations/callbacks.rb', line 88

def after_validation(*args, &block)
  options = args.extract_options!
  options = options.dup
  options[:prepend] = true

  set_options_for_callback(options)

  set_callback(:validation, :after, *args, options, &block)
end

#before_validation(*args, &block)

Defines a callback that will get called right before validation.

class Person
  include ActiveModel::Validations
  include ActiveModel::Validations::Callbacks

  attr_accessor :name

  validates_length_of :name, maximum: 6

  before_validation :remove_whitespaces

  private
    def remove_whitespaces
      name.strip!
    end
end

person = Person.new
person.name = '  bob  '
person.valid? # => true
person.name   # => "bob"
[ GitHub ]

  
# File 'activemodel/lib/active_model/validations/callbacks.rb', line 55

def before_validation(*args, &block)
  options = args.extract_options!

  set_options_for_callback(options)

  set_callback(:validation, :before, *args, options, &block)
end

#set_options_for_callback(options) (private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/validations/callbacks.rb', line 99

def set_options_for_callback(options)
  if options.key?(:on)
    options[:on] = Array(options[:on])
    options[:if] = [
      ->(o) {
        options[:on].intersect?(Array(o.validation_context))
      },
      *options[:if]
    ]
  end
end