Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

will now return nil instead of raise a NoMethodError if the receivin…

…g object does not implement the method
  • Loading branch information...
commit 99ea1a875b06feb4346869f371e2a57a2cc0a0fc 1 parent 3205c76
@dhh dhh authored
View
2  activesupport/CHANGELOG.md
@@ -1,5 +1,7 @@
## Rails 4.0.0 (unreleased) ##
+* `Object#try` will now return nil instead of raise a NoMethodError if the receiving object does not implement the method *DHH*
+
* `Time#change` now works with time values with offsets other than UTC or the local time zone. *Andrew White*
* `ActiveSupport::Callbacks`: deprecate usage of filter object with `#before` and `#after` methods as `around` callback. *Bogdan Gusiev*
View
5 activesupport/lib/active_support/core_ext/object/try.rb
@@ -5,6 +5,9 @@ class Object
# *Unlike* that method however, a +NoMethodError+ exception will *not* be raised
# and +nil+ will be returned instead, if the receiving object is a +nil+ object or NilClass.
#
+ # This is also true if the receiving object does not implemented the tried method. It will
+ # return +nil+ in that case as well.
+ #
# If try is called without a method to call, it will yield any given block with the object.
#
# Please also note that +try+ is defined on +Object+, therefore it won't work with
@@ -31,7 +34,7 @@ def try(*a, &b)
if a.empty? && block_given?
yield self
else
- public_send(*a, &b)
+ public_send(*a, &b) if respond_to?(a.first)
end
end
end
View
8 activesupport/test/core_ext/object_and_class_ext_test.rb
@@ -99,13 +99,13 @@ 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_nonexisting_method_with_arguments
method = :undefined_method
assert !@string.respond_to?(method)
- assert_raise(NoMethodError) { @string.try(method, 'llo', 'y') }
+ assert_nil @string.try(method, 'llo', 'y')
end
def test_valid_method
@@ -124,7 +124,7 @@ def test_nil_to_type
assert_nil nil.try(:to_s)
assert_nil nil.try(:to_i)
end
-
+
def test_false_try
assert_equal 'false', false.try(:to_s)
end
@@ -148,6 +148,6 @@ def private_method
end
end
- assert_raise(NoMethodError) { klass.new.try(:private_method) }
+ assert_nil klass.new.try(:private_method)
end
end

0 comments on commit 99ea1a8

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