¿Cómo uso los objetos de dominio de middleware con cache_classes fuera?
-
13-09-2019 - |
Pregunta
En el entorno de desarrollo de los carriles, cache_classes
está apagado para que pueda modificar código bajo app/
y ver los cambios sin necesidad de reiniciar el servidor.
En todos los ambientes, sin embargo, el middleware se creará una vez solamente. Así que si tengo middleware como esto:
class MyMiddleware
def initialize(app)
@app = app
end
def call(env)
env['model'] = MyModel.first
end
end
y hago esto en config/environments/development.rb
:
config.cache_classes = false # the default for development
config.middleware.use MyMiddleware
a continuación, siempre voy a conseguir el error siguiente:
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'
...
El problema es que se crea la instancia MyMiddleware
una vez en el tiempo de carga del sistema, pero la clase MyModel
se vuelve a cargar en cada llamada.
Me trataron 'MyModel'.constantize.first
para retrasar la unión a la clase hasta método de llamar a tiempo, pero eso cambia el problema a uno nuevo:
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'
...
Otros consejos
Nos encontramos con un problema similar al suyo hace algún tiempo. Por lo que yo recuerdo que esto podría remediarse mediante el establecimiento de time_zone en environment.rb a: UTC. Fue hace un tiempo y no recuerdo exactamente el nombre del parámetro de configuración o si fue 'UTC' o: UTC. Darle una oportunidad, tal vez que va a ayudar.