Module: ROM::Model::Validator::ClassMethods

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

Instance Method Summary collapse

Instance Method Details

#>>(other) ⇒ Composite

Compose a validation with a command

The command will be called if validations succeed

Examples:

validated_command = (UserValidator >> users.create)
validated_command.call(attributes)

Returns:



182
183
184
# File 'lib/rom/model/validator.rb', line 182

def >>(other)
  Composite.new(self, other)
end

#call(attributes) ⇒ Model::Attributes

Trigger validation for specific attributes

Parameters:

Returns:



166
167
168
169
# File 'lib/rom/model/validator.rb', line 166

def call(attributes)
  validator = new(attributes)
  validator.call
end

#embedded(name, options = {}, &block) ⇒ Object

Specify an embedded validator for nested structures

Examples:

class UserValidator
  include ROM::Model::Validator

  set_model_name 'User'

  embedded :address do
    validates :city, :street, :zipcode, presence: true
  end

  emebdded :tasks do
    validates :title, presence: true
  end
end

validator = UserAttributes.new(address: {}, tasks: {})

validator.valid? # false
validator.errors[:address].first # errors for address
validator.errors[:tasks] # errors for tasks


210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/rom/model/validator.rb', line 210

def embedded(name, options = {}, &block)
  presence = options.fetch(:presence, true)

  validator_class = Class.new {
    include ROM::Model::Validator
  }

  validator_class.set_model_name(name.to_s.classify)
  validator_class.class_eval(&block)

  embedded_validators[name] = validator_class

  validates name, presence: true if presence

  validate do
    value = attributes[name]

    if value.present?
      Array([value]).flatten.each do |object|
        validator = validator_class.new(object, root, attributes)
        validator.validate

        if validator.errors.any?
          errors.add(name, validator.errors)
        else
          errors.add(name, [])
        end
      end
    end
  end
end

#relation(name = nil) ⇒ Symbol

Set relation name for a validator

This is needed for validators that require database access

Examples:


class UserValidator
  include ROM::Model::Validator

  relation :users

  validates :name, uniqueness: true
end

Returns:

  • (Symbol)


145
146
147
148
# File 'lib/rom/model/validator.rb', line 145

def relation(name = nil)
  @relation = name if name
  @relation
end

#set_model_name(name) ⇒ 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.



151
152
153
154
155
156
157
# File 'lib/rom/model/validator.rb', line 151

def set_model_name(name)
  class_eval <<-RUBY
    def self.model_name
      @model_name ||= ActiveModel::Name.new(self, nil, #{name.inspect})
    end
  RUBY
end