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
# 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
# File lib/validated_object.rb, line 86 def check_validations! raise ArgumentError, errors.full_messages.join('; ') if invalid? self end
# 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
# 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