Метод обтекания класса через alias_method_chain в плагине для Redmine - PullRequest
3 голосов
/ 17 февраля 2010

Я не уверен, является ли эта проблема общей проблемой Rails или специфичной для Redmine.

Существует класс User, у которого есть метод класса try_to_login.Я написал модуль, содержащий method_alias_chain, чтобы обернуть этот метод и обеспечить дополнительную функциональность.Это работает нормально, если я иду в консоль и вызываю try_to_login.Моя обертка будет выполнена и все в порядке.Однако, когда я запускаю это на сервере, вызывается только метод vanilla.Обертка никогда не трогается.Я добавил команду logger в метод vanilla, чтобы быть уверенным, что он на самом деле вызывается.

Вот упрощенная версия кода:

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)

Кроме того, этот модуль требуетсякогда плагин загружен.

1 Ответ

3 голосов
/ 17 февраля 2010

Как вам модуль? Если вы работаете в режиме разработки, класс User может быть перезагружен после первого запроса, который очистит ваш патч и alias_method_chain.

Вы можете обойти это, выполнив патч внутри Dispatcher (который запускается при каждой перезагрузке кода):

require 'dispatcher'

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

Ссылка: http://theadmin.org/articles/2009/04/13/how-to-modify-core-redmine-classes-from-a-plugin/

...