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.
alias_method ist eine Active Support-Methode, das ist, warum sind Sie hier wahrscheinlich nicht definiert zu werden. –
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
Ich habe die Frage zuvor falsch verstanden, unten ist eine aktualisierte Version näher an dem, was Sie versuchen, zu tun. –