Class: ValidatedObject::Base Abstract

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Validations
Defined in:
lib/validated_object.rb

Overview

This class is abstract.

Subclass and add ‘attr_accessor` and validations to create custom validating objects.

Uses ActiveModel::Validations to create self-validating Plain Old Ruby objects. This is especially useful when importing data from one system into another. This class also creates very readable error messages.

Examples:

Writing a self-validating object

class Dog < ValidatedObject::Base
  attr_accessor :name, :birthday

  validates :name, presence: true
  validates :birthday, type: Date, allow_nil: true
end

Instantiating and automatically validating

# The dog1 instance validates itself at the end of instantiation.
# Here, it succeeds and so doesn't raise an exception.
dog1 = Dog.new name: 'Spot'

# We can also explicitly test for validity
dog1.valid?  # => true

dog1.birthday = Date.new(2015, 1, 23)
dog1.valid?  # => true

Making an instance invalid

dog1.birthday = '2015-01-23'
dog1.valid?  # => false
dog1.check_validations!  # => ArgumentError: Birthday is class String, not Date

See Also:

Defined Under Namespace

Classes: Boolean, TypeValidator

Constant Summary collapse

EMPTY_HASH =
{}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(attributes = EMPTY_HASH) ⇒ Base

Instantiate and validate a new object.

Examples:

maru = Dog.new(birthday: Date.today, name: 'Maru')

Raises:

  • (ArgumentError)

    if the object is not valid at the end of initialization or ‘attributes` is not a Hash.



61
62
63
64
65
66
67
# File 'lib/validated_object.rb', line 61

def initialize(attributes=EMPTY_HASH)
  raise ArgumentError, "#{attributes} is not a Hash" unless attributes.is_a?(Hash)

  set_instance_variables from_hash: attributes
  check_validations!
  return self
end

Instance Method Details

#check_validations!ValidatedObject::Base

Run any validations and raise an error if invalid.

Returns:

Raises:

  • (ArgumentError)

    if any validations fail.



73
74
75
76
# File 'lib/validated_object.rb', line 73

def check_validations!
  raise ArgumentError, errors.full_messages.join('; ') if invalid?
  self
end