Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

don't raise NoMethodError the tried method doesn't exists

  • Loading branch information...
commit 29a5aeaae976bf8432d57ec996c7c81932a39de6 1 parent f674aed
@dmathieu dmathieu authored
View
2  activesupport/lib/active_support/core_ext/object/try.rb
@@ -28,6 +28,8 @@ class Object
def try(*a, &b)
if a.empty? && block_given?
yield self
+ elsif !a.empty? && !respond_to?(a.first)
+ nil
else
__send__(*a, &b)
end
View
2  activesupport/test/core_ext/object_and_class_ext_test.rb
@@ -99,7 +99,7 @@ def setup
def test_nonexisting_method
method = :undefined_method
assert !@string.respond_to?(method)
- assert_raise(NoMethodError) { @string.try(method) }
+ assert_nil @string.try(method)
end
def test_valid_method

7 comments on commit 29a5aea

@laserlemon

Could somebody please explain this change?

As I understand it, the purpose of Object#try is to call a method on an object of an expected class, but that could also be nil. In what situation would you want to silently avoid a NoMethodError? If I'm trying a method that doesn't exist in my expected class, I should know about it.

@dmathieu
Collaborator

On STI objects where you might have methods defined for some records, but not for others for example.

@josevalim
Owner
@jonleighton
Collaborator

Agreed, I think we should revert this.

@alindeman

-1 to this change as well. It's not acceptable to radically change the behavior at this point.

@josevalim
Owner
@arunagw
Collaborator

This commit 587dd7d also need to revert the fix the failing test. Or might need a fix!

587dd7d commit is not having test.

Please sign in to comment.
Something went wrong with that request. Please try again.