我在模型中实现了以下method_missing
代码:
# class Thought
def self.method_missing(method_id, *arguments, &block)
if $CLIENT.respond_to?(method_id)
$CLIENT.send(method_id, *arguments, &block)
# Do some stuff with it
else
super
end
end
$CLIENT
是一个全局对象。请注意,类为method_missing
,而不是实例。
我在脚本/控制台中尝试了以下内容:
>> $CLIENT.respond_to?(:my_thoughts)
=> true
>> $CLIENT.send(:my_thoughts, 'bob', 5)
=> #<#<Class:01xe229be>:0x241391>
>> Thought.send(:my_thoughts, 'bob', 5)
ArgumentError: wrong # of arguments(1 for 2)
from [filepath]:50:in `method_missing'
from (irb):4
我有什么不明显的东西在这里失踪吗?我在Rails 2.3.8和jRuby上运行它,如果这有所不同。
修改:这让我更加困惑:
>> Thought.send(:my_thoughts, 'bob', 5, 5)
ArgumentError: wrong # of arguments(3 for 2)
from [filepath]:50:in `method_missing'
from (irb):23
用Integer之外的其他东西替换第二个参数似乎有效,但当然这个参数应该是一个Integer ...我现在怀疑jRuby或我集成到这里的Java类中的问题。 / p>
答案 0 :(得分:2)
你提供的代码对我来说都适用于ruby-1.8.7以及ruby-1.9.2,所以听起来你正在使用的jRuby版本中存在一个错误。为了完整性,这是我运行的代码:
#!/usr/bin/env ruby
class Client
def my_thoughts(person, val)
puts "#{person} is thinking #{val}"
end
end
$CLIENT = Client.new
class Thought
def self.method_missing(method_id, *arguments, &block)
if $CLIENT.respond_to?(method_id)
$CLIENT.send(method_id, *arguments, &block)
# Do some stuff with it
else
super
end
end
end
Thought.send(:my_thoughts, 'bob', 5)
答案 1 :(得分:0)
事实证明问题实际上是我从上面省略的部分:
$CLIENT.send(method_id, *arguments, &block).collect |item|
显然它有一个定义的“收集”方法,它带有2个参数,这让我误以为它是可数的...去图。