Class: SerialTranslator::SerialTranslatorLengthValidator

Inherits:
ActiveModel::Validations::LengthValidator
  • Object
show all
Defined in:
lib/serial_translator/serial_translator_length_validator.rb

Instance Method Summary collapse

Instance Method Details

#kindObject



37
# File 'lib/serial_translator/serial_translator_length_validator.rb', line 37

def kind; :length end

#validate_each(record, attribute, _value) ⇒ Object



3
4
5
6
7
8
9
10
11
12
# File 'lib/serial_translator/serial_translator_length_validator.rb', line 3

def validate_each(record, attribute, _value)
  translations = record.__send__("#{attribute}_translations")&.values || []
  translations = [nil] if translations.empty?
  translations.each do |value|
    next if (options[:allow_blank] && value.to_s == '') ||
            (options[:allow_nil]   && value.nil?)

    validate_translation(record, attribute, value)
  end
end

#validate_translation(record, attribute, value) ⇒ Object

this is ActiveModel::Validations::LengthValidator#validate_each, only extended with more interpolation args in error_options



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/serial_translator/serial_translator_length_validator.rb', line 16

def validate_translation(record, attribute, value)
  value_length = value.respond_to?(:length) ? value.length : value.to_s.length
  error_options = options.except(*RESERVED_OPTIONS)

  CHECKS.each do |key, validity_check|
    next unless check_value = options[key]

    if !value.nil? || skip_nil_check?(key)
      next if value_length.send(validity_check, check_value)
    end

    error_options.merge!(count: check_value, actual_length: value_length)
    key == :minimum && error_options[:difference] = check_value - value_length
    key == :maximum && error_options[:difference] = value_length - check_value

    default_message = options[MESSAGES[key]]
    error_options[:message] ||= default_message if default_message
    record.errors.add(attribute, MESSAGES[key], **error_options)
  end
end