In der Rails-Entwicklungsumgebung ist cache_classes
deaktiviert, sodass Sie den Code unter app/
ändern und Änderungen anzeigen können, ohne den Server neu zu starten.Wie verwende ich Domänenobjekte aus der Middleware mit deaktivierten Cache-Klassen?
In allen Umgebungen wird Middleware jedoch nur einmal erstellt. Also, wenn ich Middleware wie diese:
class MyMiddleware
def initialize(app)
@app = app
end
def call(env)
env['model'] = MyModel.first
end
end
und ich tue dies in config/environments/development.rb
:
config.cache_classes = false # the default for development
config.middleware.use MyMiddleware
dann werde ich immer folgende Fehlermeldung erhalten:
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'
...
Das Problem ist, dass Die MyMiddleware
Instanz wird einmal zur Systemladezeit erstellt, die Klasse MyModel
wird jedoch bei jedem Aufruf erneut geladen.
Ich versuchte 'MyModel'.constantize.first
bis Methode Bereitschaftszeit zur Klasse verbindlich zu verzögern, aber das ändert sich das Problem auf eine neue:
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'
...