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.

War es hilfreich?

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

Referenz:

scroll top