2012-12-02 52 views
5

我正在爲客戶端從Rails 2.x重寫/重構遺留應用程序到3.x.作爲重構的一部分,我也想從本地語言中的模型/方法轉向純英文代碼庫。在Rails中棄用整個模型

這涉及爲幾乎所有功能編寫新方法。我解決這個問題的方法做:

def english_method 
    # ... 
end 

def native_method 
    warn 'DEPRECATED, please use #english_method' 
    english_method 
end 

這工作正常方法,並幫助我跟蹤其中仍在使用老方法的地方,而不會破壞任何代碼。

對於類(模型),但是,我一直在做:

class NativeClass < EnglishClass 
    # DEPRECATED, Please use EnglishClass 
end 

class EnglishClass 
    # ... 
end 

這個「作品」,每當NativeClass被調用,應用程序繼續工作,但我不日誌中得到任何消息通知我一部分仍在撥打NativeClass的應用程序。

如何確保NativeClass的每個「觸摸」實際上都會導致寫入日誌錯誤?

我試過(無故不是想着「也許這個作品」等)做:

class NativeClass < EnglishClass 
    -> { ActiveSupport::Deprecation.warn 'Native model is deprecated in favor of English' } 
end 

但是(明顯?)沒有工作。我認爲lambda會在每次調用NativeClass時被加載,但是我對lambda的理解仍然很淺,所以我可能會在這裏弄錯。

任何關於如何棄用整個類的線索,並在觸摸時向我的日誌發送警告消息?

其他「最佳實踐」和/或解決方案的棄用是受歡迎的,但我不確定這是否是一個有效的問題(因此我不想冒這個問題的風險)。

回答

2

你可能會更好,只是逐個棄用每種方法。這很容易通過使用Rails的棄用方法並將其傳遞給您想要棄用的方法列表來完成。方法的類中定義的列表可通過將假以public_instance_methods

class NativeClass < EnglishClass 
    def method1 
    end 

    def method2 
    end 

    deprecate *public_instance_methods(false) 
end 

注意,它需要的最後一次公開方法後聲明。

+0

其實,我不想棄用的所有方法(只是還沒有),我只是想,現在不建議使用類名。所以我仍然希望所有的方法保持不變,我只是希望在使用不推薦使用的類名稱調用方法時發出警告。我可能會使用其他所有方法插入的新的「棄用」方法,但我希望能找到更簡單的解決方案。 – JeanMertz

4

嘗試使用這樣的:

class NativeClass < EnglishClass 
    def initialize 
    ActiveSupport::Deprecation.warn "NativeClass is deprecated and may be removed from future releases, use EnglishClass instead.", caller 
    super 
    end 
end 
+0

這個解決方案的問題(據我所知和測試)是,只有當我創建一個新的類對象時才觸發initialize方法。如果我調用類本身的方法或類中定義的常量,則不會觸發此方法。 – JeanMertz