2011-03-30 84 views
1

我正在使用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_classesconfig.action_controller.perform_caching都是false

這種行爲的任何光棚是有幫助的。我已經使用#extend#alias_method_chain,類重定義,等試過各種元編程的,但行爲是始終不變的。

謝謝!

+1

我想你想你的緩存配置是TRUE;在這種情況下,不是嗎?如果他們是'假',那麼你的班級_will_會重新加載,但是不會運行environment.rb中的一次性代碼... – 2011-03-30 06:10:08

+0

Doh!你說得對,澤維爾。就是這樣。我的疏忽。感謝您的支持。 – Chris 2011-03-30 19:31:40

回答

1

如果cache_classes是假的,你的類被卸載並在每次請求重新加載(因爲它們不會被緩存)。這就是你用environment.rb拍攝自己的腳。

如果你只是需要的文件和包含在類所需的模塊,你重寫被應用於每次:

require file 
class AController < ApplicationController 
    include constant_of_module_in_file 
end 

編輯:幸得澤維爾霍爾特,我只看到他的評論發佈答案後!

相關問題