Class: DateDayValidator

Inherits:
DateTimeValidator show all
Defined in:
app/validators/date_day_validator.rb

Overview

Child class of DateTimeValidator class

Example on how to use this class:
  In the model file call
    validates :model_attribute, date_day: true

  To pass parameters to have custom min/max values
    validates :model_attribute, date_day: { min_day: 3, max_day: 29 }

Description:
  This class is a custom validators for date day related attributes.
  Checks if the model_attribute is empty, an integer, and within min_day and max_day inclusive
  If BOTH year_sym and month_sym are passed in, the validity of the day within a specific year
  and month will be checked as well

Optional parameters:
  allow_blank, default true
    If true, allows the model attribute to be empty, aka not set, from base class

  message, default "must be an integer between #{@min_value} and #{@max_value}" 
    Error message to be added to the model_attribute if an error occurs

  min_day, default 1
    Minimum day value for the model_attribute

  max_day, default 31
    Maximum day value for the model_attribute

  year_sym
    Symbol of a model attribute containing the year value

  month_sym
    Symbol of a model attribute containing the month value

Instance Method Summary collapse

Instance Method Details

#validate_each(record, attribute, value) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/validators/date_day_validator.rb', line 38

def validate_each(record, attribute, value)
  @min_value = options.fetch(:min_day, 1)
  @max_value = options.fetch(:max_day, 31)

  if options.key?(:year_sym) && options.key?(:month_sym)
    year = record[options[:year_sym]]
    month = record[options[:month_sym]]

    begin
      @max_value = Time.utc(year, month).end_of_month.day
      @message = "#{value} is not a valid day for the month provided"
      
    rescue ArgumentError
      record.errors.add(options[:month_sym], "#{month} is not a valid month")
    end
  end

  super
end