Make respond_to? work as expected

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6657 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Tobias Lütke
2007-05-04 20:07:37 +00:00
parent 0c960602fe
commit 0306e4a204
2 changed files with 28 additions and 0 deletions

View File

@@ -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)

View File

@@ -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 })