module AttrValidator::Validator
Public Instance Methods
validate(entity)
click to toggle source
# File lib/attr_validator/validator.rb, line 56 def validate(entity) errors = AttrValidator::ValidationErrors.new self.validations ||= {} self.custom_validations ||= [] self.associated_validations ||= {} self.validations.each do |attr_name, validators| error_messages = validate_attr(attr_name, entity, validators) errors.add_all(attr_name, error_messages) unless error_messages.empty? end self.associated_validations.each do |association_name, options| next if skip_validation?(options) validator = options[:validator].is_a?(Class) ? options[:validator].new : self.send(options[:validator]) children = entity.send(association_name) if children.is_a?(Array) validate_children(association_name, validator, children, errors) elsif children validate_child(association_name, validator, children, errors) end end self.custom_validations.each do |custom_validation| if custom_validation.is_a?(Symbol) self.send(custom_validation, entity, errors) else # it's Proc custom_validation.call(entity, errors) end end errors.to_hash end
validate!(entity)
click to toggle source
# File lib/attr_validator/validator.rb, line 86 def validate!(entity) errors = validate(entity) unless errors.empty? raise AttrValidator::Errors::ValidationError.new("Validation Error", errors) end end
Private Instance Methods
skip_validation?(options)
click to toggle source
# File lib/attr_validator/validator.rb, line 105 def skip_validation?(options) if options[:if] if options[:if].is_a?(Symbol) true unless self.send(options[:if]) elsif options[:if].is_a?(Proc) true unless self.instance_exec(&options[:if]) else false end elsif options[:unless] if options[:unless].is_a?(Symbol) true if self.send(options[:unless]) elsif options[:unless].is_a?(Proc) true if self.instance_exec(&options[:unless]) else false end end end
validate_attr(attr_name, entity, validators)
click to toggle source
# File lib/attr_validator/validator.rb, line 95 def validate_attr(attr_name, entity, validators) attr_value = entity.send(attr_name) error_messages = [] validators.each do |validator, validation_rule| error_messages = validator.validate(attr_value, validation_rule) break unless error_messages.empty? end error_messages end
validate_child(association_name, validator, child, errors)
click to toggle source
# File lib/attr_validator/validator.rb, line 141 def validate_child(association_name, validator, child, errors) child_errors = validator.validate(child).to_hash unless child_errors.empty? errors.messages["#{association_name}_errors".to_sym] = child_errors end end
validate_children(association_name, validator, children, errors)
click to toggle source
# File lib/attr_validator/validator.rb, line 125 def validate_children(association_name, validator, children, errors) if validator.respond_to?(:validate_all) children_errors = validator.validate_all(children) elsif validator.respond_to?(:validate) children_errors = children.inject([]) do |errors, child| errors << validator.validate(child).to_hash end else raise NotImplementedError, "Validator should respond at least to :validate or :validate_all" end unless children_errors.all?(&:empty?) errors.messages["#{association_name}_errors".to_sym] ||= [] errors.messages["#{association_name}_errors".to_sym] += children_errors end end