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