Module: InstanceValidator

Defined in:
lib/instance_validator.rb

Class Method Summary collapse

Class Method Details

.validates(record, *attributes) ⇒ Object

Allows us to use easily use default validators in instance methods with the same syntax & behavior as class-level validations

Based on ActiveModel::Validations::ClassMethods#validates

Raises:

  • (ArgumentError)


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/instance_validator.rb', line 9

def validates(record, *attributes)
  initial_error_count = record.errors.count
  validations = attributes.extract_options!

  raise ArgumentError, 'You need to supply at least one attribute' if attributes.empty?
  raise ArgumentError, 'You need to supply at least one validation' if validations.empty?

  validations.each do |key, options|
    next unless options
    key = "#{key.to_s.camelize}Validator"

    begin
      validator = ActiveModel::Validations.const_get(key)
    rescue NameError
      raise ArgumentError, "Unknown validator: '#{key}'"
    end

    options = {} if options.is_a? TrueClass
    validator.new(options.merge(attributes: attributes)).validate(record)
  end

  record.errors.count == initial_error_count
end