我正在使用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