如何使用中间件中的域对象关闭cache_classes?

在rails开发环境中, cache_classes已关闭,因此您可以修改app/下的代码,并在不重新启动服务器的情况下查看更改。

但是,在所有环境中,中间件只创建一次。 所以,如果我有这样的中间件:

 class MyMiddleware def initialize(app) @app = app end def call(env) env['model'] = MyModel.first end end 

我在config/environments/development.rb执行此操作:

 config.cache_classes = false # the default for development config.middleware.use MyMiddleware 

然后我总会得到以下错误:

 A copy of MyMiddleware has been removed from the module tree but is still active! /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:414:in `load_missing_constant' /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:96:in `const_missing' /Users/me/projects/my_project/lib/my_middleware.rb:8:in `call' /Library/Ruby/Gems/1.8/gems/actionpack-2.3.2/lib/action_controller/middleware_stack.rb:72:in `new' ... 

问题是MyMiddleware实例是在系统加载时创建的,但MyModel类在每次调用时都会重新加载。

我尝试'MyModel'.constantize.first延迟绑定到类,直到方法调用时,但这会将问题更改为新的问题:

 You have a nil object when you didn't expect it! The error occurred while evaluating nil.include? /Library/Ruby/Gems/1.8/gems/activerecord-2.3.2/active_record/attribute_methods.rb:142in `create_time_zone_conversion_attribute?' /Library/Ruby/Gems/1.8/gems/activerecord-2.3.2/active_record/attribute_methods.rb:75:in `define_attributes_methods' ... 

这似乎是一个Rails错误。 看看你是否可以将你的Rails版本升级到2.3.4或2.3.5。

我相信这是修复问题的提交。 原始的错误报告在这里 。

我们前段时间遇到了与你类似的问题。 据我所知,这可以通过将environment.rb中的time_zone设置为:utc来解决。 这是一段时间以前,我不记得确切的配置参数名称或它是’UTC’还是:utc。 尝试一下,也许它会有所帮助。