aboutsummaryrefslogtreecommitdiffstats
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
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.
-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