From cc383b36aaa5f7f3f5c97431d0fc60528482b723 Mon Sep 17 00:00:00 2001 From: Wen-Tien Chang Date: Wed, 30 Dec 2009 05:01:48 +0800 Subject: [PATCH] fix missing invalid datetime data --- .../lib/active_record/attribute_methods.rb | 3 ++- activerecord/test/cases/base_test.rb | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletions(-) diff --git a/activerecord/lib/active_record/attribute_methods.rb b/activerecord/lib/active_record/attribute_methods.rb index e2d52aa..32cabe3 100644 --- a/activerecord/lib/active_record/attribute_methods.rb +++ b/activerecord/lib/active_record/attribute_methods.rb @@ -190,11 +190,12 @@ module ActiveRecord def define_write_method_for_time_zone_conversion(attr_name) method_body = <<-EOV def #{attr_name}=(time) + original_time = time unless time.acts_like?(:time) time = time.is_a?(String) ? Time.zone.parse(time) : time.to_time rescue time end time = time.in_time_zone rescue nil if time - write_attribute(:#{attr_name}, time) + write_attribute(:#{attr_name}, time || original_time) end EOV evaluate_attribute_method attr_name, method_body, "#{attr_name}=" diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb index e1579b0..287be14 100755 --- a/activerecord/test/cases/base_test.rb +++ b/activerecord/test/cases/base_test.rb @@ -17,6 +17,7 @@ require 'models/comment' require 'models/minimalistic' require 'models/warehouse_thing' require 'models/parrot' +require 'models/membership' require 'rexml/document' class Category < ActiveRecord::Base; end @@ -136,6 +137,17 @@ class BasicsTest < ActiveRecord::TestCase assert_equal category_attrs , category.attributes_before_type_cast end + def test_read_attributes_before_type_cast_on_invalid_datetime + ActiveRecord::Base.time_zone_aware_attributes = true + ActiveRecord::Base.default_timezone = :utc + membership = Membership.new({:joined_on=>"foobar"}) + assert_equal "foobar", membership.attributes_before_type_cast["joined_on"] + ensure + ActiveRecord::Base.time_zone_aware_attributes = false + ActiveRecord::Base.default_timezone = :local + Time.zone = nil + end + if current_adapter?(:MysqlAdapter) def test_read_attributes_before_type_cast_on_boolean bool = Booleantest.create({ "value" => false }) -- 1.6.4.2