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