class ActiveModel::Validations::CollectionItemsValidator

Adds collection items validation to ActiveModel::Model.

Usage: @example

class FooBar
  include ActiveModel::Model

  attr_accessor :kinds

  validates :kinds, collection_items { type: Symbol, inclusion: { in: [:foo, :bar] } }
end

Attributes

inner_validators[R]

Public Class Methods

new(*) click to toggle source
Calls superclass method
# File lib/active_model/validations/collection_items_validator.rb, line 21
def initialize(*)
  super.tap { set_inner_validators }
end

Public Instance Methods

validate_each(record, attribute, value) click to toggle source
# File lib/active_model/validations/collection_items_validator.rb, line 25
def validate_each(record, attribute, value)
  if value.kind_of? Enumerable
    validate_collection(record, attribute, value)
  else
    record.errors.add attribute, 'must be a collection'
  end
end

Private Instance Methods

set_inner_validators() click to toggle source
# File lib/active_model/validations/collection_items_validator.rb, line 37
def set_inner_validators
  inner_validation_options = options.except(:class)
  @inner_validators = inner_validation_options.map do |validator_name, inner_options|
    InnerValidatorBuilder.build validator_name, inner_options
  end
end
validate_collection(record, attribute, value) click to toggle source
# File lib/active_model/validations/collection_items_validator.rb, line 48
def validate_collection(record, attribute, value)
  record.extend ArrayAttributeReader
  validator_value_pairs_for(value).each do |validator, (item, index)|
    validator.validate_each record, :"#{attribute}[#{index}]", item
  end
end
validator_value_pairs_for(value) click to toggle source
# File lib/active_model/validations/collection_items_validator.rb, line 44
def validator_value_pairs_for(value)
  inner_validators.product(value.each_with_index.to_a)
end