2011-03-30 75 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 

编辑:幸得泽维尔霍尔特,我只看到他的评论发布答案后!

相关问题