2010-02-17 54 views
3

我不確定這個問題是否是普遍的Rails問題或者是特定的Redmine。在Redmine的插件中通過alias_method_chain封裝類方法

有一個類的用戶,它有一個類方法try_to_login。我編寫了一個包含method_alias_chain的模塊來包裝該方法並提供其他功能。如果我進入控制檯並調用try_to_login,這工作正常。我的包裝將被執行,一切都很好。但是,當我在服務器上運行這個時,只調用了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) 

另外被當該插件被載入需要這個模塊。

回答

3

你是如何要求模塊?如果您正在開發模式下運行,則可以在第一次請求清除您的補丁和alias_method_chain後重新加載User類。

你可以做一個調度程序(它與每個代碼重載運行)內的補丁繞過它:

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/

+0

非常感謝你,這是非常有幫助!在你的代碼 看着 http://github.com/edavis10/redmine_extra_ldap/blob/707df49063c0ffe67c9a8035920a7e2b75b04dd0/init.rb 和http://github.com/edavis10/redmine_extra_ldap/blob/707df49063c0ffe67c9a8035920a7e2b75b04dd0/lib/redmine_extra_ldap/patches/ auth_source_ldap_patch.rb 使解決問題變得簡單! 你是搖滾男人! – ajmurmann 2010-02-17 22:46:47