diff --git a/lib/validates_timeliness/active_record/attribute_methods.rb b/lib/validates_timeliness/active_record/attribute_methods.rb index 6488519..57128cd 100644 --- a/lib/validates_timeliness/active_record/attribute_methods.rb +++ b/lib/validates_timeliness/active_record/attribute_methods.rb @@ -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,16 +48,22 @@ 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) + write_date_time_attribute(name, value, column.type, time_zone_aware) end timeliness_methods << method_name 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 } diff --git a/spec/active_record/attribute_methods_spec.rb b/spec/active_record/attribute_methods_spec.rb index 2672d92..5bfbe76 100644 --- a/spec/active_record/attribute_methods_spec.rb +++ b/spec/active_record/attribute_methods_spec.rb @@ -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