1

我正在使用 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 对象上调用此方法时,它可以正常工作/按预期工作。

谁能看到这里发生了什么?

4

2 回答 2

2

这可能是动态方法或幽灵方法
,如果

ads.respond_to?(:total_entries) # => false
ads.total_entries
ads.respond_to?(:total_entries) # => true

这意味着在某处(可能在method_missingtotal_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只需使用方法名称作为参数处理它并执行您想要的操作。

于 2013-06-06T00:58:02.770 回答
1

即使ads.total_entries没有必要的作品也意味着total_entries存在 puts 方法。

当您调用一个不存在的方法时,Ruby 会调用method_missing处理程序来处理您的调用。

要找到确切的原因,请提供Ad.search返回的类的定义。

于 2013-06-06T00:39:53.090 回答