diff --git a/lib/validates_timeliness/attribute_methods.rb b/lib/validates_timeliness/attribute_methods.rb index 2ddc276..ba55343 100644 --- a/lib/validates_timeliness/attribute_methods.rb +++ b/lib/validates_timeliness/attribute_methods.rb @@ -22,9 +22,16 @@ module ValidatesTimeliness end EOV class_eval(method_body, __FILE__, line) - else - super end + super rescue(NoMethodError) + end + + end + + module InstanceMethods + + def _timeliness_raw_value_for(attr_name) + @attributes_cache && @attributes_cache["_#{attr_name}_before_type_cast"] end end @@ -35,7 +42,7 @@ module ValidatesTimeliness if timeliness_validated_attributes.include?(attr_name) method_body, line = <<-EOV, __LINE__ + 1 def #{attr_name}_before_type_cast - @attributes_cache && @attributes_cache["_#{attr_name}_before_type_cast"] + _timeliness_raw_value_for('#{attr_name}') end EOV class_eval(method_body, __FILE__, line) diff --git a/lib/validates_timeliness/validator.rb b/lib/validates_timeliness/validator.rb index cd22ba6..2ad3478 100644 --- a/lib/validates_timeliness/validator.rb +++ b/lib/validates_timeliness/validator.rb @@ -56,8 +56,7 @@ module ValidatesTimeliness end def attribute_raw_value(record, attr_name) - before_type_cast = "#{attr_name}_before_type_cast" - record.send(before_type_cast) if record.respond_to?(before_type_cast) + record._timeliness_raw_value_for(attr_name) end def type_cast(value) diff --git a/spec/validates_timeliness/attribute_methods_spec.rb b/spec/validates_timeliness/attribute_methods_spec.rb index d2db27e..c778e25 100644 --- a/spec/validates_timeliness/attribute_methods_spec.rb +++ b/spec/validates_timeliness/attribute_methods_spec.rb @@ -4,19 +4,35 @@ describe ValidatesTimeliness::AttributeMethods do before do Employee.validates_datetime :birth_datetime Employee.define_attribute_methods + Person.validates_datetime :birth_datetime + Person.define_attribute_methods [:birth_datetime] end - it 'should define attribute write method for validated attributes' do - Employee.instance_methods(false).should include("birth_datetime=") + it 'should define _timeliness_raw_value_for instance method' do + Person.instance_methods.should include('_timeliness_raw_value_for') + end + + context "attribute write method" do + it 'should cache attribute raw value' do + r = Employee.new + r.birth_datetime = date_string = '2010-01-01' + r._timeliness_raw_value_for(:birth_datetime).should == date_string + end end - it 'should define attribute before_type_cast method for validated attributes' do - Employee.instance_methods(false).should include("birth_datetime_before_type_cast") - end + context "before_type_cast method" do + it 'should be defined on class if ORM supports it' do + Employee.instance_methods(false).should include("birth_datetime_before_type_cast") + end - it 'should store original raw value on attribute write' do - r = Employee.new - r.birth_datetime = '2010-01-01' - r.birth_datetime_before_type_cast.should == '2010-01-01' + it 'should not be defined if ORM does not support it' do + Person.instance_methods(false).should_not include("birth_datetime_before_type_cast") + end + + it 'should return original value' do + r = Employee.new + r.birth_datetime = date_string = '2010-01-01' + r.birth_datetime_before_type_cast.should == date_string + end end end