module GovUkDateFields::ActsAsGovUkDate::ClassMethods

Constants

DEFAULT_GOV_UK_DATE_OPTIONS
VALID_ERROR_CLASH_BEHAVIOUR_OPTIONS

Public Instance Methods

acts_as_gov_uk_date(*date_fields) click to toggle source
Calls superclass method
# File lib/gov_uk_date_fields/acts_as_gov_uk_date.rb, line 12
def acts_as_gov_uk_date(*date_fields)
  options = _extract_supported_options!(date_fields)

  validate :validate_gov_uk_dates, if: options[:validate_if]

  after_initialize :populate_gov_uk_dates

  cattr_accessor :_gov_uk_dates
  self._gov_uk_dates = date_fields


  # call valid? on each of the gov_uk date fields, and add error messages
  # into the errors hash if not valid
  #
  define_method(:validate_gov_uk_dates) do
    date_fields.each do |date_field|
      next if self.instance_variable_get("@_#{date_field}".to_sym).valid?
      case options[:error_clash_behaviour]
      when :append_gov_uk_date_field_error
        errors.add(date_field, "Invalid date")
      when :omit_gov_uk_date_field_error
        next
      when :override_with_gov_uk_date_field_error
        errors.delete(date_field)
        errors.add(date_field, "Invalid date")
      end
    end
  end

  # For each of the gov uk date fields, we have to define the following
  # instance methods (assuming the date field name is dob):
  #
  # * dob       - retuns the date object (i.e. @_dob.date)
  # * dob=      - populatees @_dob
  # * dob_dd    - returns the day value for form popualtion
  # * dob_dd=   - sets the day value (used when updating from a form)
  # * dob_mm    - returns the month value for form popualtion
  # * dob_mm=   - sets the month value (used when updating from a form)
  # * dob_yyyy  - returns the year value for form popualtion
  # * dob_yyyy= - sets the year value (used when updating from a form)
  #
  date_fields.each do |field|

    # #dob=(date) = assigns a date to the GovukDateFields::FormDate object
    define_method("#{field}=") do |new_date|
      raise ArgumentError.new("#{new_date} is not a Date object") unless new_date.respond_to?(:to_date) || new_date.nil?
      new_date = new_date.to_date unless new_date.nil?
      GovUkDateFields::FormDate.set_from_date(self, field, new_date)
      super(new_date)
    end

    # #dob_dd   - return the day value for form population
    define_method("#{field}_dd") do
      return self.instance_variable_get("@_#{field}".to_sym).dd
    end

    # #dob_mm   - return the day value for form population
    define_method("#{field}_mm") do
      return self.instance_variable_get("@_#{field}".to_sym).mm
    end

    # #dob_yyyy   - return the day value for form population
    define_method("#{field}_yyyy") do
      return self.instance_variable_get("@_#{field}".to_sym).yyyy
    end

    # #dob_dd= - set the day part of the date (used in population of model from form)
    define_method("#{field}_dd=") do |day| 
      GovUkDateFields::FormDate.set_date_part(:dd, self, field, day)
    end   

    # #dob_dd= - set the day part of the date (used in population of model from form)
    define_method("#{field}_mm=") do |month| 
      GovUkDateFields::FormDate.set_date_part(:mm, self, field, month)
    end   

    # #dob_dd= - set the day part of the date (used in population of model from form)
    define_method("#{field}_yyyy=") do |year| 
      GovUkDateFields::FormDate.set_date_part(:yyyy, self, field, year)
    end   

  end

  include GovUkDateFields::ActsAsGovUkDate::LocalInstanceMethods
end

Protected Instance Methods

_extract_supported_options!(args) click to toggle source
# File lib/gov_uk_date_fields/acts_as_gov_uk_date.rb, line 104
def _extract_supported_options!(args)
  options = DEFAULT_GOV_UK_DATE_OPTIONS.merge(args.extract_options!)
  options.assert_valid_keys(*_supported_options)
  raise ArgumentError.new("Invalid parameters specified for :error_clash_behaviour") unless options[:error_clash_behaviour].in?(VALID_ERROR_CLASH_BEHAVIOUR_OPTIONS)
  options
end
_supported_options() click to toggle source
# File lib/gov_uk_date_fields/acts_as_gov_uk_date.rb, line 100
def _supported_options
  [:validate_if, :error_clash_behaviour]
end