我正在使用Rails 2.3.5。我想要的是在應用程序啓動時加載"#{Rails.root}/lib/extensions"
中的Ruby模塊,並將其包含在控制器和/或模型中。這是很容易通過將類似下面的代碼在我的environment.rb
底部完成:爲什麼我的方法每次都不會覆蓋工作?
Dir["#{Rails.root}/lib/extensions/*.rb"].each do |file|
......
AController.send(:require, file)
AController.send(:include, constant_of_module_in_file)
end
工程。我可以測試它。我的模塊被包括在內。在其中一些模塊的我這樣做:
def self.included(klass)
klass.class_eval { ... overwrite some methods ... }
end
當我測試與scripts/console
這個代碼我得到了我想要的:每當我呼籲AController的實例方法我重寫方法被調用。當我運行webapp並測試應該運行我的覆蓋的代碼時,情況並非如此。相反,一個有趣的事情發生:在第一個請求我得到我所期望的(覆蓋行爲),但隨後的請求運行我試圖覆蓋的方法! 這是爲什麼?
我看到了這樣的行爲之前,它通常是因爲重載類是發生在開發環境。在這種情況下,然而,config.cache_classes
和config.action_controller.perform_caching
都是false
。
這種行爲的任何光棚是有幫助的。我已經使用#extend
,#alias_method_chain
,類重定義,等試過各種元編程的,但行爲是始終不變的。
謝謝!
我想你想你的緩存配置是TRUE;在這種情況下,不是嗎?如果他們是'假',那麼你的班級_will_會重新加載,但是不會運行environment.rb中的一次性代碼... – 2011-03-30 06:10:08
Doh!你說得對,澤維爾。就是這樣。我的疏忽。感謝您的支持。 – Chris 2011-03-30 19:31:40