Module: ROM::Model::Validator

Defined in:
lib/rom/model/validator.rb,
lib/rom/model/validator/uniqueness_validator.rb

Overview

Mixin for ROM-compliant validator objects

Examples:


class UserAttributes
  include ROM::Model::Attributes

  attribute :name

  validates :name, presence: true
end

class UserValidator
  include ROM::Model::Validator
end

attrs = UserAttributes.new(name: '')
UserValidator.call(attrs) # raises ValidationError

Defined Under Namespace

Modules: ClassMethods Classes: UniquenessValidator

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object (private)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This is needed for ActiveModel::Validations to work properly as it expects the object to provide attribute values. Meh.



108
109
110
111
112
113
114
# File 'lib/rom/model/validator.rb', line 108

def method_missing(name, *args, &block)
  if attr_names.include?(name)
    attributes[name]
  else
    super
  end
end

Instance Attribute Details

#attr_namesObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



61
62
63
# File 'lib/rom/model/validator.rb', line 61

def attr_names
  @attr_names
end

#attributesModel::Attributes (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:



58
59
60
# File 'lib/rom/model/validator.rb', line 58

def attributes
  @attributes
end

#parentObject (readonly)



71
72
73
# File 'lib/rom/model/validator.rb', line 71

def parent
  @parent
end

#rootObject (readonly)



66
67
68
# File 'lib/rom/model/validator.rb', line 66

def root
  @root
end

Class Method Details

.included(base) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Inclusion hook that extends a class with required interfaces



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/rom/model/validator.rb', line 41

def self.included(base)
  base.class_eval do
    extend ClassMethods
    extend ROM::ClassMacros

    include ActiveModel::Validations
    include Equalizer.new(:attributes, :errors)

    base.defines :embedded_validators

    embedded_validators({})
  end
end

Instance Method Details

#callModel::Attributes

Trigger validations and return attributes on success

Returns:

Raises:



97
98
99
100
# File 'lib/rom/model/validator.rb', line 97

def call
  raise ValidationError, errors unless valid?
  attributes
end

#initialize(attributes, root = attributes, parent = nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



76
77
78
79
80
81
# File 'lib/rom/model/validator.rb', line 76

def initialize(attributes, root = attributes, parent = nil)
  @attributes = attributes
  @root = root
  @parent = parent
  @attr_names = self.class.validators.map(&:attributes).flatten.uniq
end

#to_modelModel::Attributes

Returns:



86
87
88
# File 'lib/rom/model/validator.rb', line 86

def to_model
  attributes
end