From d204a09df21ce3578081108936a57707b5ece9b8 Mon Sep 17 00:00:00 2001
From: Edouard CHIN <edouard.chin@shopify.com>
Date: Wed, 10 Jul 2019 23:30:44 +0200
Subject: Switch to use `class_attribute`:

- Since `ActiveModel::Error` can now be inherited by
  `ActiveModel::NestedError`, when the latter generates a
  `full_message`, the `i18n_customize_full_message` accessor set in
  the parent class is not set.

  This commit fixes that by using a `class_attribute` instead.
---
 activemodel/lib/active_model/error.rb                      |  7 +++----
 activemodel/test/cases/validations/i18n_validation_test.rb | 13 +++++++++++++
 2 files changed, 16 insertions(+), 4 deletions(-)

(limited to 'activemodel')

diff --git a/activemodel/lib/active_model/error.rb b/activemodel/lib/active_model/error.rb
index aef28b5af0..6deab3578d 100644
--- a/activemodel/lib/active_model/error.rb
+++ b/activemodel/lib/active_model/error.rb
@@ -1,5 +1,7 @@
 # frozen_string_literal: true
 
+require "active_support/core_ext/class/attribute"
+
 module ActiveModel
   # == Active \Model \Error
   #
@@ -8,10 +10,7 @@ module ActiveModel
     CALLBACKS_OPTIONS = [:if, :unless, :on, :allow_nil, :allow_blank, :strict]
     MESSAGE_OPTIONS = [:message]
 
-    class << self
-      attr_accessor :i18n_customize_full_message # :nodoc:
-    end
-    self.i18n_customize_full_message = false
+    class_attribute :i18n_customize_full_message, default: false
 
     def self.full_message(attribute, message, base_class) # :nodoc:
       return message if attribute == :base
diff --git a/activemodel/test/cases/validations/i18n_validation_test.rb b/activemodel/test/cases/validations/i18n_validation_test.rb
index ea5b335f44..c81649f493 100644
--- a/activemodel/test/cases/validations/i18n_validation_test.rb
+++ b/activemodel/test/cases/validations/i18n_validation_test.rb
@@ -59,6 +59,19 @@ class I18nValidationTest < ActiveModel::TestCase
     assert_equal "Name test cannot be blank", person.errors.full_message(:name_test, "cannot be blank")
   end
 
+  def test_errors_full_messages_on_nested_error_uses_attribute_format
+    ActiveModel::Error.i18n_customize_full_message = true
+    I18n.backend.store_translations("en", activemodel: {
+      errors: { models: { person: { attributes: { gender: "Gender" } } } },
+      attributes: { "person/contacts": { gender: "Gender" } }
+    })
+
+    person = person_class.new
+    error = ActiveModel::Error.new(person, :gender, "can't be blank")
+    person.errors.import(error, attribute: "person[0].contacts.gender")
+    assert_equal ["Gender can't be blank"], person.errors.full_messages
+  end
+
   def test_errors_full_messages_uses_attribute_format
     ActiveModel::Error.i18n_customize_full_message = true
 
-- 
cgit v1.2.3