Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Make respond_to? work as expected

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6657 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
commit 0306e4a20483a91d9288ac6f20e6b79db6eca7a7 1 parent 0c96060
Tobias Lütke authored
View
20 activeresource/lib/active_resource/base.rb
@@ -316,6 +316,26 @@ def load(attributes)
end
self
end
+
+ # For checking respond_to? without searching the attributes (which is faster).
+ alias_method :respond_to_without_attributes?, :respond_to?
+
+ # A Person object with a name attribute can ask person.respond_to?("name"), person.respond_to?("name="), and
+ # person.respond_to?("name?") which will all return true.
+ def respond_to?(method, include_priv = false)
+ method_name = method.to_s
+ if attributes.nil?
+ return super
+ elsif attributes.has_key?(method_name)
+ return true
+ elsif ['?','='].include?(method_name.last) && attributes.has_key?(method_name.first(-1))
+ return true
+ end
+ # super must be called at the end of the method, because the inherited respond_to?
+ # would return true for generated readers, even if the attribute wasn't present
+ super
+ end
+
protected
def connection(refresh = false)
View
8 activeresource/test/base_test.rb
@@ -178,6 +178,14 @@ def test_find_by_id
assert_kind_of Person, matz
assert_equal "Matz", matz.name
end
+
+ def test_respond_to
+ matz = Person.find(1)
+ assert matz.respond_to?(:name)
+ assert matz.respond_to?(:name=)
+ assert matz.respond_to?(:name?)
+ assert !matz.respond_to?(:java)
+ end
def test_find_by_id_with_custom_prefix
addy = StreetAddress.find(1, :params => { :person_id => 1 })
Please sign in to comment.
Something went wrong with that request. Please try again.