Rails方法丢失 - 如何获得'其他'的回溯案件?

时间:2014-04-18 18:23:25

标签: ruby-on-rails method-missing

我有一个引用的模型和作为另一个类的实例的实例变量。我想将缺少的方法委托给该变量,如下所示:

  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

2 个答案:

答案 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!