2017-02-17 15 views
0

私は呼び出したい実際のメソッド(before_filter/before_actionのような)を呼び出す前にメソッドを呼び出せるように、メタプログラミング(ruby 2.3.1を使用)を使用しています。私は以下のコードに到着 -NoMethodError:未定義メソッド `alias_method '

以下の擬似コードは私は理論的には私はメタプログラミングを使ってやりたいことを理解することができたSOメンバーの助けを借りて

module Api 
    def call_this_method_everytime 
    if A 
     go ahead and call the actual method being called 
    else 
     stop here do not call he method it was supposed to call 
    end 
    end 

    def when_i_call_this_method 

    end 

    def or_this_method 

    end 
end 

を達成しようとしていますについて説明します。代わりに私が欲しいメソッドを呼び出すの

module Api 
    def heartbeat 
     ... 
    end 

    def interceptor(name) 
     original_method = "original #{name}" 
     alias_method original_method, name 
     define_method(name) do |*args| 
     heartbeat 
     result = send original_method, *args 
     puts "The method #{name} called!" 
     result 
     end 
    end 

end 

は - 私は、引数として呼び出したい実際の関数の名前を持つインターセプタメソッドを呼び出します。私はまずheartbeat関数を呼び出し、チェックがOKならば実際に実際の関数を呼び出すことに進みます。

は、しかし、メタプログラミングの限られた知識を持つ私は助けにはならなかった周りの検索このエラー

NoMethodError: undefined method 'alias_method'

を取得しています。どんな助けもありがたい。

+0

alias_methodあなたはおそらくここに未定義得ている理由です、アクティブなサポート方法です。 –

+0

'interceptor(my_method)'が呼び出されたときに私が正しく理解しているかどうかを見てみましょう。my_methodを修正して最初の機能を呼び出すようにしたいのですか?あなたのコードでは、alias_methodを使って元のメソッドの「コピー」を作成しています。このメソッドを呼び出すと、変更されたメソッドを呼び出すことができますか? – eiko

+0

私は以前、あなたがやろうとしているものに近いアップデート版です。 –

答えて

1

同じことを行うための簡単な方法:

def interceptor(name, *args) 
    if 1 == 1 
    send name, args 
    end 
end 

interceptor(:puts, "oi") 
+0

私はpetrosがインターセプタを一度呼び出すことを望んでいると考えて、メソッドの将来の呼び出しを傍受させます。これは、毎回インターセプタを呼び出す必要があります。 – eiko

+0

@エイコ実際には、サーバーiがリクエストを送信するかどうかを「ライブ」にしてからリクエストを送信するかどうかを確認するたびに、毎回それを調整します。 –

+0

ペドロは簡単できちんとしたソリューションをありがとう! (私たちはdiff言語hehで同じ名前のbtwを持っています)しかし、どのようにすべての関数が引数を必要としないので、* args引数をオプションにすることはできますか? –

関連する問題