我使用的是Rails 3.2,Ruby 1.9.3和ThinkingSphinx(最新版本)。
此代码在Ruby 1.8.7 / Rails 2.3上运行正常,但由于我已升级到上面的代码,因此无效。
ads = Ad.search "ipod"
ads.respond_to?(:total_entries)
puts ads.total_entries #outputs 472
特别是
ads.respond_to?(:total_entries)
返回false,但是当我在ads对象上调用此方法时,它可以正常工作。
谁能看到这里发生了什么?
答案 0 :(得分:2)
这可以是动态方法或鬼方法 如果
ads.respond_to?(:total_entries) # => false
ads.total_entries
ads.respond_to?(:total_entries) # => true
这意味着在某个地方(可能在method_missing
中)total_entries
已动态创建,如:
define_method :total_entries do
#do some stuff here
end
或如果
ads.respond_to?(:total_entries) # => false
ads.total_entries
ads.respond_to?(:total_entries) # => false
然后method_missing
刚用方法名称作为参数处理它,并做了你想要的。
答案 1 :(得分:1)
即使ads.total_entries
无效也意味着存在放置total_entries
方法。
当你调用一个不存在的方法时,Ruby会调用method_missing
处理程序来处理你的调用。
要查找确切原因,请提供Ad.search
返回的类的定义。