Class: Aspect::Validator

Inherits:
Object
  • Object
show all
Defined in:
lib/aspect/validator.rb

Overview

Verify a set of checks on a list of an object’s attributes.

Uses a Verifier for each attribute run the checks.

Examples:

Basic usage.

require "aspect/validator"

user = User.new(name: "Foo Bar")
user_validator = Aspect::Validator.new

user_validator.verify(:name, presence: true)
user_validator.verify(:age, presence: true, integer: true, greater_than_or_equal_to: 18)

user.age = nil
user_validator.validate(user) # => { age: { presence: true, integer: true, greater_than_or_equal_to: 18 } }

user.age = 17.98
user_validator.validate(user) # => { age: { integer: true, greater_than_or_equal_to: 18 } }

user.name = ""
user.age = 17
user_validator.validate(user) # => { name: { presence: true }, age: { greater_than_or_equal_to: 18 } }

user.name = "Foo Bar"
user.age = 25
user_validator.validate(user) # => nil # Valid

Initialize with ‘Hash`

Aspect::Validator.new(name: { presence: true }, age: { presence: true, integer: true, greater_than_or_equal_to: 18 })

Displaying validation errors with MessageTransform.

require "aspect/validator"
require "aspect/message_transform"

user = User.new(name: "Foo Bar")

error_message = Aspect::MessageTransform.new(
  presence: "Must be given.",
  integer: "Must give a number.",
  greater_than_or_equal_to: "Must be %{greater_than_or_equal_to} or greater."
)

user_validator = Aspect::Validator.new
user_validator.verify(:name, presence: true)
user_validator.verify(:age, presence: true, integer: true, greater_than_or_equal_to: 18)

user_errors = user_validator.validate(user)

puts error_message.to_s(user_errors) if user_errors

Displaying validation errors with MessageTransform and Internationalization (I18N).

require "aspect/validator"
require "aspect/message_transform"

user = User.new(name: "Foo Bar")

dictionary_data = {
  en: {
    attributes: {
      age: "age"
    },
    errors: {
      presence: "must not be blank",
      greater_than_or_equal_to: "must be greater than or equal to %{value}"
    }
  },
  es: {
    attributes: {
      age: "edad"
    },
    errors: {
      presence: "no debe estar en blanco",
      greater_than_or_equal_to: "debe ser mayor que o igual a %{value}"
    }
  }
}

language = :en
dictionary = Aspect::MessageTransform.new(dictionary_data)
user_validator = Aspect::Validator.new(name: { presence: true }, age: { presence: true, greater_than_or_equal_to: 18 })

user_errors = user_validator.validate(user)

if user_errors
  user_errors.each do |attribute_name, error|
    attribute_name = dictionary.to_s("#{language}.attributes.#{attribute_name}")

    puts "#{attribute_name}: " + dictionary.to_s("#{language}.errors" => error)
  end
end

Instance Method Summary collapse

Constructor Details

#initializeValidator

Returns a new instance of Validator.



92
93
94
# File 'lib/aspect/validator.rb', line 92

def initialize
  @verifications = []
end

Instance Method Details

#validate(object) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
# File 'lib/aspect/validator.rb', line 100

def validate(object)
  errors = Errors.new

  @verifications.each do |constraint|
    value = object.send(constraint.name)
    errors = constraint.validate(value)
    # errors.add() # TODO
  end

  errors
end

#verify(attributes = {}) ⇒ Object



96
97
98
# File 'lib/aspect/validator.rb', line 96

def verify(attributes={})
  @verifications << Verifier.new(attributes)
end