fix bug preventing custom class methods on date/times

This commit is contained in:
Adam Meehan 2010-03-19 14:11:13 +11:00
parent e9eb812c9e
commit b356363791
2 changed files with 26 additions and 4 deletions

View File

@ -24,7 +24,6 @@ module ValidatesTimeliness
def write_date_time_attribute(attr_name, value, type, time_zone_aware)
@attributes_cache["_#{attr_name}_before_type_cast"] = value
value = ValidatesTimeliness::Parser.parse(value, type)
if value && type != :date
@ -49,9 +48,10 @@ module ValidatesTimeliness
columns_hash.each do |name, column|
if [:date, :time, :datetime].include?(column.type)
time_zone_aware = create_time_zone_conversion_attribute?(name, column) rescue false
method_name = "#{name}="
next if instance_method_already_implemented?(method_name)
time_zone_aware = create_time_zone_conversion_attribute?(name, column) rescue false
define_method(method_name) do |value|
write_date_time_attribute(name, value, column.type, time_zone_aware)
end
@ -59,6 +59,11 @@ module ValidatesTimeliness
end
end
# Hack to get around instance_method_already_implemented? caching the
# methods in the ivar. It then appears to subsequent calls that the
# methods defined here, have not been and get defined again.
@_defined_class_methods = nil
define_attribute_methods_without_timeliness
# add generated methods which is a Set object hence no += method
timeliness_methods.each {|attr| generated_methods << attr }

View File

@ -137,4 +137,21 @@ describe ValidatesTimeliness::ActiveRecord::AttributeMethods do
person.birth_date.should == tomorrow
end
describe "attribute writer" do
it "should be able to be overridden in class" do
Person.class_eval { attr_accessor :birth_date }
person = Person.new
person.birth_date = 'overriden'
person.birth_date.should == 'overriden'
end
after do
Person.class_eval do
undef_method(:birth_date)
undef_method(:birth_date=)
end
end
end
end