module DateAsString::ClassMethods

Public Instance Methods

date_as_string(*args) click to toggle source
# File lib/date_as_string.rb, line 42
def date_as_string(*args)
  defaults = {:input_formats => [:mm_dd_yyyy, :mm_dd_yyyy, :mmddyyyy, :mmddyy, :t_pmd],
              :default_display_format => :mm_dd_yyyy,
              :century_cutoff => 20,
              :default => nil}
  options = args.last.is_a?(Hash) ? defaults.merge(args.pop) : defaults

  #We're current not doing anything with the options...
  #We should support default formats, default value, and allowable formats...

  unless self.respond_to?(:date_as_string_options)
    cattr_accessor :date_as_string_options
    self.date_as_string_options = {}
  end

  args.each do |attribute_name|
    self.date_as_string_options[attribute_name] = options

    validate :"#{attribute_name}_format"

    define_method "#{attribute_name}_string" do |*display_format|
      if instance_variable_get("@#{attribute_name}_string")
        instance_variable_get("@#{attribute_name}_string")
      else
        if self.send("#{attribute_name}").nil?
          if options[:default] && options[:default].is_a?(String)
            eval(options[:default])
          elsif options[:default] && options[:default].is_a?(Proc)
            options[:default].call
          else
            nil
          end
        else
          #self.send("#{attribute_name}").strftime('%m/%d/%Y')
          unless display_format.empty?
            DateAsString::Formats.find_format(display_format[0]).strftime(self.send("#{attribute_name}"))
          else
            DateAsString::Formats.find_format(options[:default_display_format]).strftime(self.send("#{attribute_name}"))
          end
        end
      end
    end

    define_method "#{attribute_name}_string=" do |str|
      instance_variable_set("@#{attribute_name}_string", str)
      self.send("#{attribute_name}=", DateAsString.parse_string(str))
    end

    define_method "#{attribute_name}_format" do
      re = /^(([tT]([\-\+]\d+)?)|(\d{6})|(\d{8})|([0-1]?\d\/[0-3]?\d\/\d\d)|([0-1]?\d\/[0-3]?\d\/(19|20)\d\d))$/

      attribute_string = instance_variable_get("@#{attribute_name}_string")

      #No string was entered - this clears the date
      return if attribute_string.blank?

      #the entered string did not match a regex...
      if (attribute_string =~ re).nil?
        errors.add("#{attribute_name}_string", "must be in the format of MM/DD/YY, MM/DD/YYYY, MMDDYY, MMDDYYYY or t, t+#, t-#")
        return
      end

      #The mapping did not work for some reason...
      if self.send("#{attribute_name}").nil?
        errors.add("#{attribute_name}_string", :invalid)
      end
    end
  end
end