From f8e91bda9c171dd0c31dbea95ba4e9ced4ee2547 Mon Sep 17 00:00:00 2001 From: Sam Pohlenz Date: Wed, 7 Oct 2009 09:05:54 -0500 Subject: [PATCH] Don't share attribute matchers between classes [#3216 state:resolved] Allows separate models that include ActiveModel::AttributeMethods to use different sets of attribute matchers. Signed-off-by: Joshua Peek --- .../lib/active_model/attribute_methods.rb | 5 ++++- .../test/cases/attribute_methods_test.rb | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 activemodel/test/cases/attribute_methods_test.rb diff --git a/activemodel/lib/active_model/attribute_methods.rb b/activemodel/lib/active_model/attribute_methods.rb index aa35a2726e53c..26ee9c43151e9 100644 --- a/activemodel/lib/active_model/attribute_methods.rb +++ b/activemodel/lib/active_model/attribute_methods.rb @@ -1,3 +1,6 @@ +require 'active_support/core_ext/hash/keys' +require 'active_support/core_ext/class/inheritable_attributes' + module ActiveModel class MissingAttributeError < NoMethodError end @@ -219,7 +222,7 @@ def method_missing_target end def attribute_method_matchers #:nodoc: - @@attribute_method_matchers ||= [] + read_inheritable_attribute(:attribute_method_matchers) || write_inheritable_attribute(:attribute_method_matchers, []) end end diff --git a/activemodel/test/cases/attribute_methods_test.rb b/activemodel/test/cases/attribute_methods_test.rb new file mode 100644 index 0000000000000..614c4a3645ca3 --- /dev/null +++ b/activemodel/test/cases/attribute_methods_test.rb @@ -0,0 +1,20 @@ +require 'cases/helper' + +class ModelWithAttributes + include ActiveModel::AttributeMethods + + attribute_method_suffix '' +end + +class ModelWithAttributes2 + include ActiveModel::AttributeMethods + + attribute_method_suffix '_test' +end + +class AttributeMethodsTest < ActiveModel::TestCase + test 'unrelated classes should not share attribute method matchers' do + assert_not_equal ModelWithAttributes.send(:attribute_method_matchers), + ModelWithAttributes2.send(:attribute_method_matchers) + end +end