una rutas rails que paso mundo hola estructura crear comandos botones aplicacion ruby-on-rails ruby-on-rails-4 rack rack-middleware

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!