我有一个引用的模型和作为另一个类的实例的实例变量。我想将缺少的方法委托给该变量,如下所示:
def method_missing(method_name, *args, &block)
if @other_class_instance.respond_to?(method_name)
@other_class_instance.send(method_name, *args)
else
super
end
end
然而,在@other_class_instance没有响应的情况下,我希望应用程序终止并获得正常NoMethodError的完整回溯。相反,我只得到一行错误消息,例如:
#<NoMethodError: undefined method `my_method' for #<MyClass:0x00000009022fc0>>
我已经在几个地方读过,如果不存在super,那将会破坏Ruby的方法查找。
我缺少什么,以便如果other_class_instance
没有响应该方法,它的行为就像没有创建method_missing
方法一样?
更新
Logan的答案在OtherInstance类也没有定义method_missing
的情况下解决了这个问题。如果它(例如对于Rails模型),您可以执行以下操作:
begin
raise NoMethodError.new method_name
rescue => e
logger.fatal e
logger.fatal e.backtrace
super
end
答案 0 :(得分:1)
为什么要检查respond_to?
是否要发生错误?只需使用send
,就会发生NoMethodError。请参阅http://codepad.org/AaQYWjtQ - 这是正常堆栈跟踪的含义吗?
答案 1 :(得分:1)
请检查您的@other_class_instance。从你写的我想,这个实例也有respond_to?和method_missing被覆盖并生成您看到的错误消息。如果你写&#39;清洁&#39;测试@other_class_instance不会覆盖标准方法查找,一切都会按预期工作。
是的,Logan是对的,在你的情况下只需将调用传递给@ other_class_instanse.send!