aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
diff options
context:
space:
mode:
authorEdouard CHIN <edouard.chin@shopify.com>2019-07-23 17:58:59 +0200
committerEdouard CHIN <edouard.chin@shopify.com>2019-07-23 17:58:59 +0200
commitff0204bc7f5b33a04cfe4f053e3f24a65f0faff5 (patch)
tree980451091d2f5bcda302c84ad4c76a1e1ffe9002 /activemodel
parent31105c81cc82ae829c382a4eee2c5aa362882dea (diff)
downloadrails-ff0204bc7f5b33a04cfe4f053e3f24a65f0faff5.tar.gz
rails-ff0204bc7f5b33a04cfe4f053e3f24a65f0faff5.tar.bz2
rails-ff0204bc7f5b33a04cfe4f053e3f24a65f0faff5.zip
Modify behaviour of `AM::Errors#to_h`:
- `AM::Error#to_h` was kind of broken before and would return in the hash values a single error message. ```ruby person = Person.new person.errors.add(:name, "cannot be blank") person.errors.add(:name, "too long") puts person.errors.to_h # {name: 'too long'} ``` Since an attribute can have different errors, the previous behavior didn't make much sense. Now, `ActiveModel::Errors#to_hash` correctly returns an array of error messages containing all the errors for an attribute. However, one can easily be surprised by this change, so let's deprecated it first.
Diffstat (limited to 'activemodel')
-rw-r--r--activemodel/lib/active_model/errors.rb8
-rw-r--r--activemodel/test/cases/errors_test.rb5
2 files changed, 9 insertions, 4 deletions
diff --git a/activemodel/lib/active_model/errors.rb b/activemodel/lib/active_model/errors.rb
index e7405fb586..480f24183a 100644
--- a/activemodel/lib/active_model/errors.rb
+++ b/activemodel/lib/active_model/errors.rb
@@ -304,9 +304,13 @@ module ActiveModel
end
def to_h
- deprecation_rename_warning(:to_h, :to_hash)
+ ActiveSupport::Deprecation.warn(<<~EOM)
+ ActiveModel::Errors#to_h is deprecated and will be removed in Rails 6.2
+ Please use `ActiveModel::Errors.to_hash` instead. The values in the hash
+ returned by `ActiveModel::Erors.to_hash` is an array of error messages.
+ EOM
- to_hash
+ to_hash.transform_values { |values| values.last }
end
def messages
diff --git a/activemodel/test/cases/errors_test.rb b/activemodel/test/cases/errors_test.rb
index 79ccfe0c13..a6cd1da717 100644
--- a/activemodel/test/cases/errors_test.rb
+++ b/activemodel/test/cases/errors_test.rb
@@ -477,10 +477,11 @@ class ErrorsTest < ActiveModel::TestCase
test "to_h is deprecated" do
person = Person.new
person.errors.add(:name, "cannot be blank")
+ person.errors.add(:name, "too long")
- expected_deprecation = "ActiveModel::Errors#to_h is deprecated. Please call #to_hash instead."
+ expected_deprecation = "ActiveModel::Errors#to_h is deprecated"
assert_deprecated(expected_deprecation) do
- assert_equal({ name: ["cannot be blank"] }, person.errors.to_h)
+ assert_equal({ name: "too long" }, person.errors.to_h)
end
end