перезагрузить стек рельсов в разработке для запросов через пользовательское промежуточное ПО - PullRequest
1 голос
/ 11 января 2012

Я использую пользовательское промежуточное ПО Rack в своем приложении Rails 3.1, которое оборачивается вокруг ванильного контроллера Rails:

в routes.rb

stacked_router = 
  Example::Middleware::StackedRouter.new(ProductsController.action(:show))

match '/:id', :to => stacked_router

в example/middleware/stacked_router.rb

class Example::Middleware::StackedRouter
  def initialize(app)
    @app = app
  end

  def call(env)
    # ... do stuff before forwarding the request, then
    @app.call(env) # forward the request
  end
end

Это прекрасно работает.

Однако есть одна загвоздка: когда я сейчас изменяю код в ProductsController, изменения не принимаются автоматически.Я должен перезапустить приложение вручную (touch tmp/restart.txt)

Какой способ сказать стеку Rails, что ему необходимо перезагрузить этот кусок промежуточного программного обеспечения при изменении кода?

Ответы [ 3 ]

2 голосов
/ 26 января 2012

Инструмент, который вам нужен - автозагрузка .Когда Rails перезагружается в dev, он перебирает автоматически загруженные и явно определенные «unloadable» константы и удаляет их ( watch стека управляет этим).

В главной директории lib вашего плагина, ex.lib/stacked_router.rb, если вы заявили:

autoload Example::Middleware::StackedRouter, 'lib/middleware/stacked_router'

Я думаю, вы должны получить поведение, которое вы ищете.

Обратите внимание, что если вам не нравитсяавтозагрузка (люди утверждают, что это мешает возможности monkeypatch), вы можете пометить константу ( unloadable , затем запросить файл с помощью load (просто использование require не подхватит файл второй раз)time). или + load. Это также будет загружать класс при каждом запросе в prod, так что может быть условно загружать или требовать в зависимости от env? Возможно, Autoload - лучший выбор IMO.

Обратите внимание, что я нашел фактический код Rails (не документация Rails), чтобы быть лучшим справочником для этого.

1 голос
/ 23 января 2012

Похоже, что Rails загружает копию ProductsController в тот момент, когда сервер запускается в вашем промежуточном программном обеспечении, и сохраняет эту кэшированную копию. Я не уверен на 100% в этом, но что происходит, когда вы пытаетесь загрузить промежуточное программное обеспечение с помощью процедуры? например,

stacked_router = Proc.new {
  Example::Middleware::StackedRouter.new(ProductsController.action(:show))
}

Надеемся, что это заставит загружать новое промежуточное ПО (и новый ProductsController) при каждом запросе. Это, вероятно, будет бесполезным в производстве. Передо мной нет похожего кода, поэтому я не могу это проверить.

1 голос
/ 23 января 2012

Если вы используете Pow, вы можете использовать самоцвет порошка, чтобы легко перезапустить Pow без необходимости выполнения команды touch tmp/restart.txt. Смотри https://github.com/Rodreegez/powder.

...