class ValidatedObject::Base

@abstract Subclass and add ‘attr_accessor` and validations

to create custom validating objects.

Uses {api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates 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.

@example 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

@example 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

@example Making an instance invalid

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

@see ValidatedObject::Base::TypeValidator @see yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/ ActiveModel: Make Any Ruby Object Feel Like ActiveRecord, Yehuda Katz @see www.rubyinside.com/rails-3-0s-activemodel-how-to-give-ruby-classes-some-activerecord-magic-2937.html Rails 3.0′s ActiveModel: How To Give Ruby Classes Some ActiveRecord Magic, Peter Cooper

Constants

EMPTY_HASH
SymbolHash

Public Class Methods

new(attributes = EMPTY_HASH) click to toggle source
# File lib/validated_object.rb, line 70
def initialize(attributes = EMPTY_HASH)
  set_instance_variables from_hash: attributes
  check_validations!
  nil
end

Public Instance Methods

check_validations!() click to toggle source
# File lib/validated_object.rb, line 86
def check_validations!
  raise ArgumentError, errors.full_messages.join('; ') if invalid?

  self
end
validated_attr(attribute_name, **validation_options) click to toggle source
# File lib/validated_object.rb, line 76
def validated_attr(attribute_name, **validation_options)
  attr_reader attribute_name
  validates attribute_name, validation_options
end

Private Instance Methods

set_instance_variables(from_hash:) click to toggle source
# File lib/validated_object.rb, line 162
def set_instance_variables(from_hash:)
  from_hash.each do |variable_name, variable_value|
    # Test for the attribute reader
    send variable_name.to_sym

    # Set value in a way that succeeds even if attr is read-only
    instance_variable_set "@#{variable_name}".to_sym, variable_value
  end
end