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 85629c8 commit b164e81c1159baf35af3e22a9c6b43875c1fcf49 @drogus drogus committed Jan 15, 2012
@@ -394,7 +394,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)

5 comments on commit b164e81

@matma
matma commented on b164e81 Jan 15, 2012

Don't You forget the 't'? In ModelWithouAttributesMethod ...

@sikachu
Member

ECOMMON

@drogus
Member
drogus commented on b164e81 Jan 15, 2012

That's just to troll you :trollface:

I will push a fix to other broken tests in a few minutes and will fix it as well there.

@sikachu
Member

... and we definitely should request @github for a :trollface: emoji.

@drogus
Member
drogus commented on b164e81 Jan 15, 2012

FFFFFFFUUUUUUUUUU, it seems I can't even add a comment properly :P

Please sign in to comment.