ruby-on-rails - rutas - rails paso a paso
Recarga de middleware de rieles sin reiniciar el servidor en desarrollo (2)
¿No puedes simplemente usar escopeta ? Si entiendo su pregunta, quiere asegurarse de que el entorno se vuelva a cargar en cada cambio que realice en su código. Eso es lo que hará la escopeta.
Tengo una aplicación Rails 4 con middleware ubicado en lib / some / middleware.rb que se inyecta actualmente en la pila a través de un inicializador como sigue:
MyApp::Application.configure.do |config|
config.middleware.use ''Some::Middleware''
end
Desafortunadamente, cada vez que cambio algo necesito reiniciar el servidor. ¿Cómo puedo volver a cargarlo en cada solicitud en modo de desarrollo? He visto preguntas similares sobre cómo volver a cargar el código de lib con código de carga automática o de ajuste en un bloque to_prepare, pero no estoy seguro de cómo se podría aplicar en este escenario.
Gracias, - FJM
Actualización # 1
Si trato de eliminar el middleware y luego volver a agregarlo en un bloque to_prepare, aparece un error "No se puede modificar el arreglo congelado".
Pensé que en algún momento Rails fue lo suficientemente inteligente como para reemplazar el código de middleware en tiempo de ejecución, pero puedo estar equivocado.
Esto es lo que se me ocurrió, eludir a la clase Ruby cargando locura y aprovechando la recarga de la clase Rails.
Agregue el middleware a la pila:
# config/environments/development.rb
[...]
config.middleware.use "SomeMiddleware", "some_additional_paramter"
Haga uso de la recarga automática, pero asegúrese de que la instancia de los carriles en ejecución y el objeto de middleware ya inicializado sigan "olvidándose" del código real que se ejecuta:
# app/middlewares/some_middleware.rb
class SomeMiddleware
def initialize(*args)
@args = args
end
def call(env)
"#{self.class}::Logic".constantize.new(*@args).call(env)
end
class Logic
def initialize(app, additional)
@app = app
@additional = additional
end
def call(env)
[magic]
@app.call(env)
end
end
end
Los cambios en la lógica se deben recoger mediante la recarga automática de los rieles en cada solicitud.
¡Creo que esto realmente podría convertirse en una joya útil!