Domanda

Non sono sicuro se questo problema è un generale Rails problema o Redmine specifica.

C'è un utente di classe che ha un metodo di classe try_to_login. Ho scritto un modulo che contiene un method_alias_chain per avvolgere quel metodo e fornire funzionalità aggiuntive. Questo funziona bene se vado nella console e chiamo try_to_login. Il mio involucro sarà eseguito e tutto va bene. Tuttavia, quando si esegue questo sul server solo il metodo di vaniglia viene chiamato. L'involucro è mai toccato. Ho aggiunto un comando logger al metodo di vaniglia per essere sicuro ed è in atto di essere chiamato.

Ecco una versione semplificata del codice:

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)

In aggiunta è richiesto questo modulo, quando il plugin è caricato.

È stato utile?

Soluzione

Come stai richiedendo il modulo? Se si esegue in modalità di sviluppo, la classe utente potrebbe essere ricaricato dopo la prima richiesta che sarebbe cancellare il cerotto e alias_method_chain.

È possibile ottenere intorno ad esso facendo la patch all'interno di un Dispatcher (che corre con ogni Reload):

require 'dispatcher'

Dispatcher.to_prepare do
  Issue.send(:include, MyMooPatch)
end

Riferimento: http://theadmin.org/articles/2009/04/13/how-to-modify-core-redmine-classes-from-a-plugin/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top