Class: ActiveModel::Validations::NumericalityValidator
- Inherits:
-
EachValidator
- Object
- ActiveModel::Validator
- EachValidator
- ActiveModel::Validations::NumericalityValidator
- Defined in:
- lib/active_model/validations/numericality.rb
Overview
:nodoc:
Constant Summary collapse
- CHECKS =
{ greater_than: :>, greater_than_or_equal_to: :>=, equal_to: :==, less_than: :<, less_than_or_equal_to: :<=, odd: :odd?, even: :even?, other_than: :!= }.freeze
- RESERVED_OPTIONS =
CHECKS.keys + [:only_integer]
- INTEGER_REGEX =
/\A[+-]?\d+\z/
- HEXADECIMAL_REGEX =
/\A[+-]?0[xX]/
Instance Attribute Summary
Attributes inherited from EachValidator
Attributes inherited from ActiveModel::Validator
Instance Method Summary collapse
- #check_validity! ⇒ Object
- #validate_each(record, attr_name, value, precision: Float::DIG, scale: nil) ⇒ Object
Methods inherited from EachValidator
Methods inherited from ActiveModel::Validator
#initialize, kind, #kind, #validate
Constructor Details
This class inherits a constructor from ActiveModel::EachValidator
Instance Method Details
#check_validity! ⇒ Object
[View source]
18 19 20 21 22 23 24 25 |
# File 'lib/active_model/validations/numericality.rb', line 18 def check_validity! keys = CHECKS.keys - [:odd, :even] .slice(*keys).each do |option, value| unless value.is_a?(Numeric) || value.is_a?(Proc) || value.is_a?(Symbol) raise ArgumentError, ":#{option} must be a number, a symbol or a proc" end end end |
#validate_each(record, attr_name, value, precision: Float::DIG, scale: nil) ⇒ Object
[View source]
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/active_model/validations/numericality.rb', line 27 def validate_each(record, attr_name, value, precision: Float::DIG, scale: nil) unless is_number?(value, precision, scale) record.errors.add(attr_name, :not_a_number, **(value)) return end if allow_only_integer?(record) && !is_integer?(value) record.errors.add(attr_name, :not_an_integer, **(value)) return end value = parse_as_number(value, precision, scale) .slice(*CHECKS.keys).each do |option, option_value| case option when :odd, :even unless value.to_i.public_send(CHECKS[option]) record.errors.add(attr_name, option, **(value)) end else case option_value when Proc option_value = option_value.call(record) when Symbol option_value = record.send(option_value) end option_value = parse_as_number(option_value, precision, scale) unless value.public_send(CHECKS[option], option_value) record.errors.add(attr_name, option, **(value).merge!(count: option_value)) end end end end |