Wie verwende ich Domain-Objekte von Middleware mit cache_classes aus?
-
13-09-2019 - |
Frage
In der Schienen-Entwicklungsumgebung, cache_classes
ausgeschaltet ist, so dass Sie Code unter app/
ändern können und Änderungen sehen, ohne den Server neu zu starten.
In allen Umgebungen, obwohl, Middleware wird nur einmal erstellt. Also, wenn ich Middleware wie folgt aus:
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 erhalten folgende Fehlermeldung:
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 einmal bei Systemladezeit erstellt wird, aber die MyModel
Klasse wird bei jedem Aufruf neu geladen.
habe ich versucht, 'MyModel'.constantize.first
bis Methode-Anforderungs-Zeitdauer der 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'
...
Andere Tipps
Wir stießen auf ein Problem ähnlich wie bei Ihnen vor einiger Zeit. utc: Soweit ich dies durch Setzen time_zone in environment.rb zu beheben erinnern konnte. Es war eine Weile her, und ich erinnere mich nicht mehr genau die Konfigurationsparameternamen oder ob es sich um ‚UTC‘ oder: utc. Probieren Sie es aus, vielleicht wird es helfen.