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) ##
* 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) ##

View file

@ -17,6 +17,18 @@ module ActiveModel
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 @@ 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

View file

@ -15,6 +15,17 @@ module ActiveModel
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