Envolviendo método de la clase a través de alias_method_chain en Plugin para Redmine
-
21-09-2019 - |
Pregunta
No estoy seguro de si este problema es un general Rails problema o RedMine específica.
Hay una clase de usuario que tiene una try_to_login método de clase. Escribí un módulo que contiene un method_alias_chain para envolver ese método y proporcionar funcionalidad adicional. Esto funciona bien si entro en la consola y llamo try_to_login. Mi envoltorio será ejecutado y todo está bien. Sin embargo, cuando ejecuto esto en el servidor se llama simplemente el método de vainilla. La envoltura no se toca. He añadido un comando logger con el método de vainilla estar seguro y que es de hecho la que llama.
Esta es una versión simplificada del código:
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)
Además se requiere este módulo cuando se carga el plugin.
Solución
¿Cómo está requiriendo el módulo? Si está ejecutando en el modo de desarrollo, la clase de usuario podría ser recargada después de la primera solicitud que limpiar su parche y alias_method_chain.
Puede llegar a su alrededor haciendo el parche en el interior de un despachador (que funciona con cada recarga de código):
require 'dispatcher'
Dispatcher.to_prepare do
Issue.send(:include, MyMooPatch)
end
Referencia: http://theadmin.org/articles/2009/04/13/how-to-modify-core-redmine-classes-from-a-plugin/