3

この問題が Rails の一般的な問題なのか、Redmine 固有の問題なのかはわかりません。

クラス メソッド try_to_login を持つクラス User があります。method_alias_chain を含むモジュールを作成して、そのメソッドをラップし、追加機能を提供しました。コンソールに移動して try_to_login を呼び出すと、これは正常に機能します。私のラッパーが実行され、すべて問題ありません。ただし、これをサーバーで実行すると、バニラメソッドだけが呼び出されます。ラッパーは決して触れられません。確かにバニラメソッドにロガーコマンドを追加しましたが、実際に呼び出されています。

コードの簡略版は次のとおりです。

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)

さらに、このモジュールはプラグインのロード時に必要です。

4

1 に答える 1

3

モジュールをどのように要求していますか? 開発モードで実行している場合、最初のリクエストの後に 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/

于 2010-02-17T03:48:01.277 に答える