Wrapping Klassenmethode über alias_method_chain in Plugin für Redmine
-
21-09-2019 - |
Frage
Ich bin nicht sicher, ob dieses Problem ist ein allgemeines Rails Problem oder Redmine spezifisch.
Es gibt eine Klasse Benutzer, die eine Klasse Methode try_to_login hat. Ich schrieb ein Modul eine method_alias_chain enthält, das Verfahren zu wickeln und zusätzliche Funktionalität bereitstellen. Das funktioniert gut, wenn ich in die Konsole und Call try_to_login gehen. Mein Wrapper wird ausgeführt und alles ist in Ordnung. Allerdings, wenn ich diese auf dem Server nur die Vanille-Methode ausgeführt wird aufgerufen. Der Wrapper wird nie berührt. Ich habe mit der Vanille-Methode einen Logger Befehl sicher sein und es in der Tat aufgerufen wird.
Hier ist eine vereinfachte Version des Codes:
require_dependency 'principal'
require_dependency 'user'
require 'login_attempt_count'
module UserLoginAttemptLimiterPatch
def self.included(base)
base.extend ClassMethods
base.class_eval do
class << self
alias_method_chain :try_to_login, :attempt_limit
end
end
end
module ClassMethods
def try_to_login_with_attempt_limit(login, password)
user = try_to_login_without_attempt_limit login, password
#stuff here gets called via console but not via browser
user
end
def authentication_failed(login)
#important code here
end
end
end
User.send(:include, UserLoginAttemptLimiterPatch)
Darüber hinaus dieses Modul ist erforderlich, wenn das Plugin geladen wird.
Lösung
Wie fordern Sie das Modul? Wenn Sie im Entwicklungsmodus ausgeführt werden, kann die Benutzerklasse nach der ersten Anfrage neu geladen werden, die Ihre Patch und alias_method_chain würde löschen.
Sie können es um durch den Patch innerhalb eines Dispatcher tun (die mit jedem Code nachladen läuft):
require 'dispatcher'
Dispatcher.to_prepare do
Issue.send(:include, MyMooPatch)
end