Permalink
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...
1 parent 95027d2 commit dee595ce04b65d27294912faff146ed402ded6d1 @drogus drogus committed Jan 15, 2012
@@ -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
@@ -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)

0 comments on commit dee595c

Please sign in to comment.