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:
parent
de354cc357
commit
eb73dfc067
3 changed files with 40 additions and 2 deletions
|
@ -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) ##
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue