Jam*_*sen 6 ruby middleware ruby-on-rails
在rails开发环境中,cache_classes关闭以便您可以修改代码app/并查看更改而无需重新启动服务器.
但是,在所有环境中,中间件只创建一次.所以,如果我有这样的中间件:
class MyMiddleware
def initialize(app)
@app = app
end
def call(env)
env['model'] = MyModel.first
end
end
Run Code Online (Sandbox Code Playgroud)
我这样做config/environments/development.rb:
config.cache_classes = false # the default for development
config.middleware.use MyMiddleware
Run Code Online (Sandbox Code Playgroud)
然后我总会得到以下错误:
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'
...
Run Code Online (Sandbox Code Playgroud)
问题是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'
...
Run Code Online (Sandbox Code Playgroud)