2012-01-11 3 views
1

Я использую пользовательские стойки промежуточного уровня в моем 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, что ему нужно перезагрузить этот кусок промежуточного программного обеспечения при изменении кода?

+0

После того как я обновил свой ответ, я wa Любопытно, могу ли я воспроизвести проблему, и я не мог. Я создал новый проект 3.2 с подклассом Product, добавил маршрутизатор, как ваш, и контроллер продуктов все еще перезагружен. Я тестировал как индекс, так и шоу, и он определенно подбирает изменения. Может быть, эта информация помогает в игре «где это не так» :) – Woahdae

ответ

1

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

+0

это работает, конечно. Но это также перезапускает все приложение, которое работает медленно. Когда я направляюсь на обычные контроллеры Rails (экземпляры «ActionController :: Base»), Rails достаточно умен, чтобы обнаруживать изменения. Но я еще не нашел, как Rails делает это. – levinalex

+0

не использовать Pow для разработки, то :) –

1

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

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

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

2

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

В главном каталоге lib вашего плагина, например. lib/stacked_router.rb, если вы объявили:

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

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

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

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