From b356363791b68f98627be7a6714d902406996971 Mon Sep 17 00:00:00 2001 From: Adam Meehan Date: Fri, 19 Mar 2010 14:11:13 +1100 Subject: [PATCH] fix bug preventing custom class methods on date/times --- .../active_record/attribute_methods.rb | 13 +++++++++---- spec/active_record/attribute_methods_spec.rb | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) 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