如何使用中间件中的域对象关闭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。 尝试一下,也许它会有所帮助。