class ActiveModel::Validations::DatetimeValidator

Public Instance Methods

date?(value) click to toggle source
# File lib/validators/validates_datetime.rb, line 6
def date?(value)
  value.is_a?(Date) || value.is_a?(Time)
end
validate_each(record, attribute, value) click to toggle source
# File lib/validators/validates_datetime.rb, line 10
def validate_each(record, attribute, value)
  return if value.blank? && options[:allow_blank]
  return if value.nil? && options[:allow_nil]

  unless date?(value)
    record.errors.add(
      attribute,
      :invalid_date,
      message: options[:message],
      value: value
    )
  end

  return unless date?(value)

  validate_after_option(record, attribute, value)
  validate_before_option(record, attribute, value)
end

Private Instance Methods

date_for(record, value, option) click to toggle source
# File lib/validators/validates_datetime.rb, line 29
        def date_for(record, value, option)
  date = case option
         when :today
           Date.today
         when :now
           Time.now
         when Time, Date, DateTime, ActiveSupport::TimeWithZone
           option
         when Proc
           option.call(record)
         else
           record.__send__(option) if record.respond_to?(option)
         end

  case date
  when Time
    value = value.to_time
  when Date
    value = value.to_date
  end

  [date, value]
end
validate_after_option(record, attribute, value) click to toggle source
# File lib/validators/validates_datetime.rb, line 53
        def validate_after_option(record, attribute, value)
  return unless options[:after]

  date, value = date_for(record, value, options[:after])

  return if value.present? && date.present? && (value && date && value > date)

  record.errors.add(
    attribute,
    :invalid_date_after,
    message: options[:after_message],
    value: value,
    date: (date?(date) ? I18n.l(date) : date.inspect)
  )
end
validate_before_option(record, attribute, value) click to toggle source
# File lib/validators/validates_datetime.rb, line 69
        def validate_before_option(record, attribute, value)
  return unless options[:before]

  date, value = date_for(record, value, options[:before])

  return if value.present? && date.present? && (value && date && value < date)

  record.errors.add(
    attribute,
    :invalid_date_before,
    message: options[:before_message],
    value: value,
    date: I18n.l(date)
  )
end