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 выполняется до кода вашего приложения, оно не будет выполняться в той же области, что и код вашего приложения - например, вы выиграли ' не может использовать ваши модели приложений и т. д., если вы явно не требуете их и не выполните необходимую инициализацию (например, установление соединения с базой данных).
Если вы ищете эмпирические правила, вот что я вам скажу:
Если вы хотите что-то сделать с запросом перед методами только в конкретном контроллере, используйте фильтр "до" в этом контроллере.
Если вы хотите сделать что-то с запросом перед всеми методами контроллера в вашем приложении, и то, что вы хотите сделать, очень специфично для вашего приложения или зависит от кода вашего приложения, используйте фильтр на ApplicationController.
Если вы хотите сделать что-то общее с запросом, совсем не привязанным к коду вашего приложения, и представьте, что было бы неплохо иметь возможность повторно использовать это в другом приложении, лучше подойдет Rack Middleware.
Надеюсь, это поможет.
Насколько я понимаю, фильтры Action Controller и промежуточное ПО Rack делают одно и то же, за исключением двух вещей:
- Промежуточное программное обеспечение Rack вызывается до стека Rails, чтобы вы могли получить некоторую производительность (хотя и не уверены в этом)
- Промежуточное программное обеспечение Rack является автономным и может использоваться повторно между различными приложениями Rack, так что ваши контроллеры Rails/Engine и Sinatra/Merb/Padrino apss чистые и СУХИЕ