Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fix stack level too deep when model does not have attributes method.

Without that patch when using ActiveModel::AttributeMethods
in a class that does not respond to `attributes` method,
stack level too deep error will be raised on non existing
method. While documentation is clear that you need to define
`attributes` method in order to use AttributeMethods module,
`stack level too deep` is rather obscure and hard to debug,
therefore we should try to not break `method_missing` if
someone forgets about defining `attributes`.
  • Loading branch information...
commit dee595ce04b65d27294912faff146ed402ded6d1 1 parent 95027d2
@drogus drogus authored
View
2  activemodel/lib/active_model/attribute_methods.rb
@@ -434,7 +434,7 @@ def respond_to?(method, include_private_methods = false)
protected
def attribute_method?(attr_name)
- attributes.include?(attr_name)
+ respond_to_without_attributes?(:attributes) && attributes.include?(attr_name)
end
private
View
8 activemodel/test/cases/attribute_methods_test.rb
@@ -76,7 +76,15 @@ def attribute(name)
end
end
+class ModelWithouAttributesMethod
+ include ActiveModel::AttributeMethods
+end
+
class AttributeMethodsTest < ActiveModel::TestCase
+ test 'method missing works correctly even if attributes method is not defined' do
+ assert_raises(NoMethodError) { ModelWithouAttributesMethod.new.foo }
+ end
+
test 'unrelated classes should not share attribute method matchers' do
assert_not_equal ModelWithAttributes.send(:attribute_method_matchers),
ModelWithAttributes2.send(:attribute_method_matchers)
Please sign in to comment.
Something went wrong with that request. Please try again.