From f7f42a2d0e7154f30d3f1f6cbedf14fc2c3f5b52 Mon Sep 17 00:00:00 2001 From: lulalala Date: Sun, 17 Mar 2019 10:25:08 +0800 Subject: Fix messages[]= does not override value --- activemodel/lib/active_model/errors.rb | 1 + activemodel/test/cases/errors_test.rb | 8 ++++++++ 2 files changed, 9 insertions(+) (limited to 'activemodel') diff --git a/activemodel/lib/active_model/errors.rb b/activemodel/lib/active_model/errors.rb index 81a65a60a7..ac19b4625e 100644 --- a/activemodel/lib/active_model/errors.rb +++ b/activemodel/lib/active_model/errors.rb @@ -631,6 +631,7 @@ module ActiveModel def []=(attribute, value) ActiveSupport::Deprecation.warn("Calling `[]=` to an ActiveModel::Errors is deprecated. Please call `ActiveModel::Errors#add` instead.") + @errors.delete(attribute) Array(value).each do |message| @errors.add(attribute, message) end diff --git a/activemodel/test/cases/errors_test.rb b/activemodel/test/cases/errors_test.rb index 513bd163fc..1e4a6ddc00 100644 --- a/activemodel/test/cases/errors_test.rb +++ b/activemodel/test/cases/errors_test.rb @@ -101,6 +101,14 @@ class ErrorsTest < ActiveModel::TestCase end end + test "[]= overrides values" do + errors = ActiveModel::Errors.new(self) + assert_deprecated { errors.messages[:foo] = "omg" } + assert_deprecated { errors.messages[:foo] = "zomg" } + + assert_equal ["zomg"], errors[:foo] + end + test "values returns an empty array after try to get a message only" do errors = ActiveModel::Errors.new(Person.new) errors.messages[:foo] -- cgit v1.2.3