diff --git a/activemodel/CHANGELOG.md b/activemodel/CHANGELOG.md index 2dfde11707cf5abaf649da526285607c496f325a..909fbe512bc8f2b637b687f445cf34ae0b469d60 100644 --- a/activemodel/CHANGELOG.md +++ b/activemodel/CHANGELOG.md @@ -1,6 +1,21 @@ ## Rails 5.2.0.beta2 (November 28, 2017) ## -* No changes. +* Return correct date while converting parameters in `value_from_multiparameter_assignment` + for `ActiveModel::Type::Date` + + Before: + + Day.new({"day(1i)"=>"1", "day(2i)"=>"1", "day(3i)"=>"1"}) + => # + + After: + + Day.new({"day(1i)"=>"1", "day(2i)"=>"1", "day(3i)"=>"1"}) + => # + + Fixes #28521 + + *Sayan Chakraborty* ## Rails 5.2.0.beta1 (November 27, 2017) ## diff --git a/activemodel/lib/active_model/type/date.rb b/activemodel/lib/active_model/type/date.rb index 8cecc16d0fff2fa92581174d95f6aa8e6ed7425c..edc408f5414cc30955b0a56f834dab3324153ac3 100644 --- a/activemodel/lib/active_model/type/date.rb +++ b/activemodel/lib/active_model/type/date.rb @@ -17,6 +17,18 @@ def type_cast_for_schema(value) value.to_s(:db).inspect end + def is_utc? + ::Time.zone_default.nil? || ::Time.zone_default =~ "UTC" + end + + def default_timezone + if is_utc? + :utc + else + :local + end + end + private def cast_value(value) @@ -49,7 +61,7 @@ def new_date(year, mon, mday) def value_from_multiparameter_assignment(*) time = super - time && time.to_date + time && new_date(time.year, time.mon, time.mday) end end end diff --git a/activemodel/test/cases/type/date_test.rb b/activemodel/test/cases/type/date_test.rb index e8cf1786124ee8b59e2229f29ff5a4f6857cd6f1..c50a549d3d9cfdf4f5908630d706b9faf3ed659f 100644 --- a/activemodel/test/cases/type/date_test.rb +++ b/activemodel/test/cases/type/date_test.rb @@ -15,6 +15,17 @@ def test_type_cast_date date_string = ::Time.now.utc.strftime("%F") assert_equal date_string, type.cast(date_string).strftime("%F") end + + def test_returns_correct_year + type = Type::Date.new + + time = ::Time.utc(1, 1, 1) + date = ::Date.new(time.year, time.mon, time.mday) + + values_hash_for_multiparameter_assignment = { 1 => 1, 2 => 1, 3 => 1 } + + assert_equal date, type.cast(values_hash_for_multiparameter_assignment) + end end end end