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