aboutsummaryrefslogtreecommitdiffstats
path: root/activeresource
diff options
context:
space:
mode:
authorTobias Lütke <tobias.luetke@gmail.com>2007-05-04 20:07:37 +0000
committerTobias Lütke <tobias.luetke@gmail.com>2007-05-04 20:07:37 +0000
commit0306e4a20483a91d9288ac6f20e6b79db6eca7a7 (patch)
tree21323db118c65adfb502b3bdf56693644a4aabc5 /activeresource
parent0c960602fe13a05a787b1cad85d61f8a45b08427 (diff)
downloadrails-0306e4a20483a91d9288ac6f20e6b79db6eca7a7.tar.gz
rails-0306e4a20483a91d9288ac6f20e6b79db6eca7a7.tar.bz2
rails-0306e4a20483a91d9288ac6f20e6b79db6eca7a7.zip
Make respond_to? work as expected
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6657 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activeresource')
-rw-r--r--activeresource/lib/active_resource/base.rb20
-rw-r--r--activeresource/test/base_test.rb8
2 files changed, 28 insertions, 0 deletions
diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb
index d2253186b0..0f147acad9 100644
--- a/activeresource/lib/active_resource/base.rb
+++ b/activeresource/lib/active_resource/base.rb
@@ -316,6 +316,26 @@ module ActiveResource
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)
diff --git a/activeresource/test/base_test.rb b/activeresource/test/base_test.rb
index 6a6ee5c64b..e9bf5d70b3 100644
--- a/activeresource/test/base_test.rb
+++ b/activeresource/test/base_test.rb
@@ -178,6 +178,14 @@ class BaseTest < Test::Unit::TestCase
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 })