RoR - Что предпочтительнее - промежуточное программное обеспечение стойки или фильтры активного контроллера?

Для последней версии Ruby on Rails (4 на момент постановки этого вопроса), каков предпочтительный способ реализации кода, модифицирующего запрос / ответ, такой как механизм аутентификации. Я вижу много сайтов и учебных пособий, защищающих промежуточное программное обеспечение Rack, хотя кажется, что та же функциональность может быть достигнута с помощью методов фильтра Action Controller.

В дополнение к разговору о предпочтительной методологии, можно ли сравнить сильные и слабые стороны каждой из них? В моем первоначальном исследовании казалось, что методы фильтра контроллера действий более тесно интегрированы в приложение RoR, так что вы можете обойти запуск определенных фильтров на определенных конечных точках контроллера, в то время как промежуточное программное обеспечение, по-видимому, не имеет такого уровня контроля. Такие детали, как это было бы здорово. Спасибо!

2 ответа

Решение

Фильтры Rack Middleware и ActionController действительно очень разные.

Rack - это стандартный интерфейс веб-сервера Ruby. Он предназначен для работы таким образом, что приложения Rack или "промежуточное ПО" могут быть объединены в цепочку, каждое из которых преобразует запрос / ответ определенным образом. Если вы создаете / используете Rack Middleware, вы получаете возможность трансформировать запрос до того, как он действительно достигнет приложения Rails.

Фильтры ActionController - это просто до / после хуков, которые выполняются до или после ваших непосредственных методов контроллера в Rails. Они будут вызваны непосредственно до или после вашего метода контроллера, но после всего остатка стека Rails.

Поэтому существуют значительные различия в том, что возможно с помощью промежуточного программного обеспечения Rack и фильтра ActionController, а именно потому, что промежуточное программное обеспечение Rack выполняется до кода вашего приложения, оно не будет выполняться в той же области, что и код вашего приложения - например, вы выиграли ' не может использовать ваши модели приложений и т. д., если вы явно не требуете их и не выполните необходимую инициализацию (например, установление соединения с базой данных).

Если вы ищете эмпирические правила, вот что я вам скажу:

  1. Если вы хотите что-то сделать с запросом перед методами только в конкретном контроллере, используйте фильтр "до" в этом контроллере.

  2. Если вы хотите сделать что-то с запросом перед всеми методами контроллера в вашем приложении, и то, что вы хотите сделать, очень специфично для вашего приложения или зависит от кода вашего приложения, используйте фильтр на ApplicationController.

  3. Если вы хотите сделать что-то общее с запросом, совсем не привязанным к коду вашего приложения, и представьте, что было бы неплохо иметь возможность повторно использовать это в другом приложении, лучше подойдет Rack Middleware.

Надеюсь, это поможет.

Насколько я понимаю, фильтры Action Controller и промежуточное ПО Rack делают одно и то же, за исключением двух вещей:

  • Промежуточное программное обеспечение Rack вызывается до стека Rails, чтобы вы могли получить некоторую производительность (хотя и не уверены в этом)
  • Промежуточное программное обеспечение Rack является автономным и может использоваться повторно между различными приложениями Rack, так что ваши контроллеры Rails/Engine и Sinatra/Merb/Padrino apss чистые и СУХИЕ
Другие вопросы по тегам