Що таке Middleware у Ruby on Rails і коли воно використовується

Обкладинка допису: Що таке Middleware у Ruby on Rails і коли воно використовується
Middleware у Ruby on Rails - це проміжний шар між клієнтським запитом і вебзастосунком. Воно отримує запит до того, як він потрапляє у контролер, і може змінювати або обробляти його. Так само Middleware може перехоплювати відповідь від застосунку перед тим, як вона буде надіслана клієнту.
Rails побудований поверх бібліотеки Rack, яка визначає стандарт для таких проміжних шарів. Middleware у цьому контексті - це звичайний Ruby-клас, який реалізує метод call(env). Параметр env містить усю інформацію про HTTP-запит (наприклад, шлях, заголовки, метод). Метод повинен повертати масив із трьох елементів: статус відповіді, заголовки та тіло.
Найпростіший приклад власного Middleware може виглядати так:
class RequestLogger
  def initialize(app)
    @app = app
  end

  def call(env)
    puts "Отримано запит до #{env['PATH_INFO']}"
    status, headers, body = @app.call(env)
    puts "Повернено статус #{status}"
    [status, headers, body]
  end
end
У цьому прикладі кожен запит буде логуватися у консоль - як при надходженні, так і після обробки.
Middleware часто використовують для таких завдань:
  • логування запитів і відповідей;
  • кешування;
  • обробки помилок;
  • аутентифікації чи перевірки токенів;
  • стиснення чи модифікації тіла відповіді;
  • встановлення загальних заголовків.
У Rails ланцюг middleware визначається у файлі config/application.rb або переглядається командою:
bin/rails middleware
Щоб додати власне middleware, його можна вставити до стеку:
config.middleware.use RequestLogger
або між іншими шарами:
config.middleware.insert_before Rack::Runtime, RequestLogger
Middleware допомагає ізолювати технічні аспекти обробки запитів - логіку безпосередньо не пов’язану з бізнес-кодом. Це робить застосунок чистішим, розширюваним і легшим для підтримки.

Цей допис поки що не має жодних доповнень від автора/ки.

module_function у Ruby: коли методи модуля доступні як модульні та як функції
29 жовт., 21:53

module_function у Ruby: коли методи модуля доступні як модульні та як функції

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке memoization в Ruby?
30 жовт., 10:17

Що таке memoization в Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
is_a?, kind_of?, instance_of? — як Ruby перевіряє тип об’єкта?
30 жовт., 19:55

is_a?, kind_of?, instance_of? — як Ruby перевіряє тип об’єкта?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
&& vs and — різниця в Ruby, яка може зламати ваш код
30 жовт., 20:23

&& vs and — різниця в Ruby, яка може зламати ваш код

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Змінні у Ruby: @, @@ та class instance variable
30 жовт., 20:54

Змінні у Ruby: @, @@ та class instance variable

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Різниця між blank?, present?, empty? та nil? у Ruby
30 жовт., 21:06

Різниця між blank?, present?, empty? та nil? у Ruby

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska