aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2019-02-18 16:04:47 +0900
committerRyuta Kamizono <kamipo@gmail.com>2019-02-18 16:04:47 +0900
commit4ea067017ae52d4a74335ed85df085a86663d213 (patch)
tree413f68bdb6283f455b788400a5e45d6ea86024d9
parent1dfd01475d93b8801df0a2933094b437a607e3e2 (diff)
parenteb73dfc0677cb5b3a0f559020fe5d7df556056b4 (diff)
downloadrails-4ea067017ae52d4a74335ed85df085a86663d213.tar.gz
rails-4ea067017ae52d4a74335ed85df085a86663d213.tar.bz2
rails-4ea067017ae52d4a74335ed85df085a86663d213.zip
Merge pull request #29651 from Sayanc93/return-correct-date
Return correct date in ActiveModel for time to date conversions
-rw-r--r--activemodel/CHANGELOG.md19
-rw-r--r--activemodel/lib/active_model/type/date.rb2
-rw-r--r--activemodel/test/cases/type/date_test.rb11
3 files changed, 30 insertions, 2 deletions
diff --git a/activemodel/CHANGELOG.md b/activemodel/CHANGELOG.md
index 912b307683..55e0c85b00 100644
--- a/activemodel/CHANGELOG.md
+++ b/activemodel/CHANGELOG.md
@@ -1,4 +1,21 @@
-* Fix year value when casting a multiparameter time hash
+* Fix date value when casting a multiparameter date hash to not convert
+ from Gregorian date to Julian date.
+
+ Before:
+
+ Day.new({"day(1i)"=>"1", "day(2i)"=>"1", "day(3i)"=>"1"})
+ => #<Day id: nil, day: "0001-01-03", created_at: nil, updated_at: nil>
+
+ After:
+
+ Day.new({"day(1i)"=>"1", "day(2i)"=>"1", "day(3i)"=>"1"})
+ => #<Day id: nil, day: "0001-01-01", created_at: nil, updated_at: nil>
+
+ Fixes #28521.
+
+ *Sayan Chakraborty*
+
+* Fix year value when casting a multiparameter time hash.
When assigning a hash to a time attribute that's missing a year component
(e.g. a `time_select` with `:ignore_date` set to `true`) then the year
diff --git a/activemodel/lib/active_model/type/date.rb b/activemodel/lib/active_model/type/date.rb
index a7e6122ff4..c5fe926039 100644
--- a/activemodel/lib/active_model/type/date.rb
+++ b/activemodel/lib/active_model/type/date.rb
@@ -46,7 +46,7 @@ module ActiveModel
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 9a393286b7..2dd1a55616 100644
--- a/activemodel/test/cases/type/date_test.rb
+++ b/activemodel/test/cases/type/date_test.rb
@@ -18,6 +18,17 @@ module ActiveModel
assert_equal date_string, type.cast(date_string).strftime("%F")
assert_equal date_string, type.cast(values_hash).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