class ActiveModel::Validations::ArrayValidator

Attributes

validators[R]

Public Class Methods

new(options) click to toggle source
Calls superclass method
# File lib/can_has_validations/validators/array_validator.rb, line 40
def initialize(options)
  record_class = options[:class]
  super
  record_class.extend DefaultKeys

  defaults = @options.dup
  validations = defaults.slice!(*record_class.send(:_validates_default_keys), :attributes)

  raise ArgumentError, "You need to supply at least one validation for :#{kind}" if validations.empty?

  defaults[:attributes] = attributes

  @validators = validations.map do |key, sub_options|
    next unless sub_options

    if (cond_keys = _parse_validates_options(sub_options).keys & %i(if on unless)).any?
      raise ArgumentError, ":#{kind} does not support conditionals on sub-validators - found on #{key}: #{cond_keys.map(&:inspect).join(', ')}"
    end

    key = "#{key.to_s.camelize}Validator"

    begin
      klass = key.include?("::".freeze) ? key.constantize : record_class.const_get(key)
    rescue NameError
      raise ArgumentError, "Unknown validator: '#{key}'"
    end

    klass.new(defaults.merge(_parse_validates_options(sub_options)).except(:if, :on, :unless))
  end
end

Public Instance Methods

validate_each(record, attribute, array_values) click to toggle source
# File lib/can_has_validations/validators/array_validator.rb, line 71
def validate_each(record, attribute, array_values)
  @validators.each do |validator|
    error_count = count_errors(record)

    Array(array_values).each do |value|
      validate_one(validator, record, attribute, value)

      # to avoid repeating error messages, stop after a single error
      unless validator.options[:multiple_errors]
        break if error_count != count_errors(record)
      end
    end
  end
end
validate_one(validator, record, attribute, value) click to toggle source
# File lib/can_has_validations/validators/array_validator.rb, line 86
def validate_one(validator, record, attribute, value)
  unless validator.is_a?(ExistenceValidator)
    return if (value.nil? && validator.options[:allow_nil]) || (value.blank? && validator.options[:allow_blank])
  end
  validator.validate_each(record, attribute, value)
end

Private Instance Methods

_parse_validates_options(options) click to toggle source

copied from active_model/validations/validates.rb

# File lib/can_has_validations/validators/array_validator.rb, line 101
def _parse_validates_options(options)
  case options
  when TrueClass
    {}
  when Hash
    options
  when Range, Array
    { in: options }
  else
    { with: options }
  end
end
count_errors(record) click to toggle source
# File lib/can_has_validations/validators/array_validator.rb, line 96
def count_errors(record)
  record.errors.count
end