Module: ActiveRecord::Validations::ClassMethods

Defined in:
lib/delocalize/rails_ext/validation.rb

Instance Method Summary collapse

Instance Method Details

#validates_date_format_of(*attr_names) ⇒ Object



72
73
74
75
76
77
78
79
80
# File 'lib/delocalize/rails_ext/validation.rb', line 72

def validates_date_format_of(*attr_names)
  configuration = { :on => :save, :allow_nil => false }
  configuration.update(attr_names.extract_options!)

  validates_each(attr_names,configuration) do |record, attr_name, value|
    raw_value = record.send("#{attr_name}_before_type_cast") || value
    Delocalize::LocalizedDateTimeParser.valid_format?(raw_value, Date)
  end
end

#validates_numericality_of(*attr_names) ⇒ Object

Validates whether the value of the specified attribute is numeric by trying to convert it to a float with Kernel.Float (if only_integer is false) or applying it to the regular expression /\A[+\-]?\d+\Z/ (if only_integer is set to true).

class Person < ActiveRecord::Base
  validates_numericality_of :value, :on => :create
end

Configuration options:

  • :message - A custom error message (default is: “is not a number”).

  • :on - Specifies when this validation is active (default is :save, other options :create, :update).

  • :only_integer - Specifies whether the value has to be an integer, e.g. an integral value (default is false).

  • :allow_nil - Skip validation if attribute is nil (default is false). Notice that for fixnum and float columns empty strings are converted to nil.

  • :greater_than - Specifies the value must be greater than the supplied value.

  • :greater_than_or_equal_to - Specifies the value must be greater than or equal the supplied value.

  • :equal_to - Specifies the value must be equal to the supplied value.

  • :less_than - Specifies the value must be less than the supplied value.

  • :less_than_or_equal_to - Specifies the value must be less than or equal the supplied value.

  • :odd - Specifies the value must be an odd number.

  • :even - Specifies the value must be an even number.

  • :if - Specifies a method, proc or string to call to determine if the validation should occur (e.g. :if => :allow_validation, or :if => Proc.new { |user| user.signup_step > 2 }). The method, proc or string should return or evaluate to a true or false value.

  • :unless - Specifies a method, proc or string to call to determine if the validation should not occur (e.g. :unless => :skip_validation, or :unless => Proc.new { |user| user.signup_step <= 2 }). The method, proc or string should return or evaluate to a true or false value.



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
62
63
64
65
66
67
68
69
70
# File 'lib/delocalize/rails_ext/validation.rb', line 28

def validates_numericality_of(*attr_names)
  configuration = { :on => :save, :only_integer => false, :allow_nil => false }
  configuration.update(attr_names.extract_options!)


  numericality_options = ALL_NUMERICALITY_CHECKS.keys & configuration.keys

  (numericality_options - [ :odd, :even ]).each do |option|
    raise ArgumentError, ":#{option} must be a number" unless configuration[option].is_a?(Numeric)
  end

  validates_each(attr_names,configuration) do |record, attr_name, value|
    raw_value = record.send("#{attr_name}_before_type_cast") || value

    next if configuration[:allow_nil] and raw_value.nil?

    unless raw_value.is_a?(Numeric)
      if configuration[:only_integer]
        matcher = /^[-+]?\d+([_]\d{3})*$/
      else
        matcher = /^[-+]?\d+([_]\d{3})*[.]?\d*$/
      end

      unless matcher.match(raw_value.to_s.strip)
        record.errors.add(attr_name, :not_a_number, :value => raw_value, :default => configuration[:message])
        next
      end

      raw_value = configuration[:only_integer] ? raw_value.to_i : raw_value.to_f
    end

    numericality_options.each do |option|
      case option
      when :odd, :even
        unless raw_value.to_i.method(ALL_NUMERICALITY_CHECKS[option])[]
          record.errors.add(attr_name, option, :value => raw_value, :default => configuration[:message])
        end
      else
        record.errors.add(attr_name, option, :default => configuration[:message], :value => raw_value, :count => configuration[option]) unless raw_value.method(ALL_NUMERICALITY_CHECKS[option])[configuration[option]]
      end
    end
  end
end

#validates_time_format_of(*attr_names) ⇒ Object



82
83
84
85
86
87
88
89
90
# File 'lib/delocalize/rails_ext/validation.rb', line 82

def validates_time_format_of(*attr_names)
  configuration = { :on => :save, :allow_nil => false }
  configuration.update(attr_names.extract_options!)

  validates_each(attr_names,configuration) do |record, attr_name, value|
    raw_value = record.send("#{attr_name}_before_type_cast") || value
    Delocalize::LocalizedDateTimeParser.valid_format?(raw_value, Time)
  end
end