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