42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
# 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
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
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")
return if attribute_string.blank?
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
if self.send("#{attribute_name}").nil?
errors.add("#{attribute_name}_string", :invalid)
end
end
end
end
|