1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Return correct date in ActiveModel for time to date conversions

time.to_date conversion happens considering leap years
so a conversion of "Day.new({'day(1i)'=>'1', 'day(2i)'=>'1', 'day(3i)'=>'1'})" results in saving the date as Mon, 03 Jan 0001
which might seem weird on the user level, hence falling back to parsing on string level resolves this data mismatch
Fixes #28521
This commit is contained in:
Sayan Chakraborty 2017-07-01 19:18:18 +05:30
parent de354cc357
commit eb73dfc067
3 changed files with 40 additions and 2 deletions

View file

@ -1,6 +1,21 @@
## Rails 5.2.0.beta2 (November 28, 2017) ## ## 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"})
=> #<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*
## Rails 5.2.0.beta1 (November 27, 2017) ## ## Rails 5.2.0.beta1 (November 27, 2017) ##

View file

@ -17,6 +17,18 @@ module ActiveModel
value.to_s(:db).inspect value.to_s(:db).inspect
end 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 private
def cast_value(value) def cast_value(value)
@ -49,7 +61,7 @@ module ActiveModel
def value_from_multiparameter_assignment(*) def value_from_multiparameter_assignment(*)
time = super time = super
time && time.to_date time && new_date(time.year, time.mon, time.mday)
end end
end end
end end

View file

@ -15,6 +15,17 @@ module ActiveModel
date_string = ::Time.now.utc.strftime("%F") date_string = ::Time.now.utc.strftime("%F")
assert_equal date_string, type.cast(date_string).strftime("%F") assert_equal date_string, type.cast(date_string).strftime("%F")
end 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 end
end end