2

別のクラスのインスタンスであるインスタンス変数を参照するモデルがあります。次のように、不足しているメソッドをその変数に委任したいと思います。

  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 と同じように完全なバックトレースを取得したいと考えています。代わりに、次のような 1 行のエラー メッセージが表示されます。

#<NoMethodError: undefined method `my_method' for #<MyClass:0x00000009022fc0>>

super がないと、Ruby のメソッド ルックアップが台無しになるということをいくつかの場所で読みました。

other_class_instanceメソッドに応答しない場合、method_missingメソッドが作成されていないかのように動作するように、何が欠けていますか?

アップデート

ローガンの答えは、 OtherInstance クラスにもmethod_missing定義されていないという条件の下で、この問題を処理します。その場合 (たとえば、Rails モデルの場合)、次のようなことができます。

 begin 
   raise NoMethodError.new method_name
 rescue => e
   logger.fatal e
   logger.fatal e.backtrace
   super
 end
4

2 に答える 2

1

@other_class_instance を確認してください。あなたが書いたことから、このインスタンスにもrespond_to?があると思います。および method_missing が上書きされ、表示されるエラー メッセージが生成されます。@other_class_instance が標準メソッド ルックアップをオーバーライドしない「クリーンな」テストを作成すると、すべてが期待どおりに機能します。

はい、ローガンはまったく正しいです。あなたの場合は、呼び出しを @other_class_instance.send に渡すだけです!

于 2014-04-18T21:15:47.917 に答える