2017-02-17 6 views
0

Ich benutze einige Metaprogrammierung (mit Ruby 2.3.1), so dass ich eine Methode aufrufen kann, bevor ich die eigentliche Methode aufrufen möchte - wie eine before_filter/before_action.NoMethodError: undefinierte Methode `alias_method '

Der Pseudo-Code unten erklärt, was ich

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 

Mit Hilfe eines SO Mitglied ich in der Lage war zu theoretisch verstehen, was ich tun mag mit metaprogramming zu erreichen versuchen, - die ich unten auf dem Code angekommen.

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 

Statt die Methode des Aufrufs ich will - ich nenne Interceptor-Methode mit dem Namen der eigentlichen Funktion i als Argument aufgerufen werden soll. Ich würde dann zuerst heartbeat Funktion aufrufen und wenn die Überprüfung OK ist, dann fahre ich fort, tatsächlich die eigentliche Funktion aufzurufen.

jedoch begrenzte Wissen über metaprogramming i mit diesem Fehler bin immer

NoMethodError: undefined method 'alias_method'

lange Suche nicht helfen. Jede Hilfe wird geschätzt.

+0

alias_method ist eine Active Support-Methode, das ist, warum sind Sie hier wahrscheinlich nicht definiert zu werden. –

+0

Lassen Sie mich sehen, wenn ich richtig verstehe - wenn 'Interceptor (my_method)' aufgerufen wird, möchten Sie my_method ändern, um zuerst Herzschlag zu rufen, bevor Sie mit seiner ursprünglichen Funktionalität fortfahren? Und in Ihrem Code verwenden Sie alias_method, um eine Art "Kopie" der ursprünglichen Methode zu erstellen, die Sie dann in der modifizierten Methode aufrufen können, sobald Sie Heartbeat aufgerufen haben? – eiko

+0

Ich habe die Frage zuvor falsch verstanden, unten ist eine aktualisierte Version näher an dem, was Sie versuchen, zu tun. –

Antwort

1

Ein einfacher Weg, um die gleiche Sache zu tun:

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

interceptor(:puts, "oi") 
+0

Ich denke Petrus will, dass Interceptor einmal aufgerufen wird, wodurch zukünftige Aufrufe der Methode abgefangen werden. dies würde erfordern, dass der Interzeptor jedes Mal aufgerufen wird. – eiko

+0

@eiko eigentlich möchte ich es jedes Mal cal, als ich überprüfe, ob der Server ich eine Anfrage senden wird in "live" zuerst und dann die Anfrage senden. –

+0

Pedro danke für die Lösung einfach und ordentlich! (wir haben den gleichen Namen btw in diff Sprache heh) Wie kann ich aber das Argument * Arguments optional machen, da nicht alle Funktionen Argumente brauchen? –

Verwandte Themen