Ruby On Rails
2026-02-26 17:18 Diff

Rack – это интерфейс для взаимодействия веб-сервера с HTTP-запросами. У него есть несколько функций:

  • Стандарт интерфейса веб-сервера. Rack определяет, как серверы обрабатывают запросы и взаимодействуют друг с другом. Позволяет использовать различные серверы для запуска приложений

  • Каркас для Middlewares. Rack работает как каркас для middleware, которые обрабатывают запросы по конвейерному принципу.

  • Библиотека. Rack содержит вспомогательные функции для более быстрой разработки. Используется в таких фреймворках, как Sinatra и Rails.

Понимание Rack важно для разработки на Sinatra и Rails, поскольку они подчиняются его стандартам.

Приложение Rack

Чтобы запустить Rack, необходимо импортировать библиотеку, вызвать хендлер и применить метод run(), передавая объект, который содержит метод call(). Приложение запускается командой ruby app.rb

Метод call() должен вернуть массив из трех элементов:

  • Статус ответа.
  • Хедеры в виде хэша.
  • Тело ответа. Тело ответа обычно представляет собой массив строк

Разработчики Rack также создали консольную утилиту под названием rackup. Эта утилита ищет файл с именем config.ru в текущей папке и запускает сервер на порту 9292. Если в config.ru указано приложение, то при отправке GET-запроса на порт 9292 сервер вернет тело ответа, указанное в качестве третьего элемента в конфигурации приложения.

Запуск может выполняться одной из команд в зависимости от используемого сервера

Проверяем работу приложения

Middlewares

Middleware – это фильтры запросов, которые обрабатывают информацию о запросе и передают её следующему компоненту.

Применение middleware:

  • Авторизация

    Middleware может управлять доступом, включая встроенные решения для basic-auth

  • Мониторинг

    Можно отслеживать количество запросов и их время выполнения

  • Логирование

    Подходит для записи работы приложения, особенно на уровне системы.

  • Сериализация

    Поддерживает передачу данных, включая динамические переменные.

  • Роутинг

    Доступ к параметрам запроса позволяет определять, как следует обрабатывать запрос.

  • Бизнес-логика

    Может реализовываться через вызов сервисных объектов в middleware.

Запрос поступает в приложение и передается через цепочку middleware, каждая из которых обрабатывает определенную логику. Ответ формируется последней middleware.

Каждый компонент middleware должен возвращать три элемента: статус, хедеры и тело ответа.

Ниже пример приложения, содержащее миддлвар

Пример приложения, которое обрабатывает POST запрос:

Запуск и выполнение запроса:

Пример Middleware, который обрабатывает предыдущий ответ от приложения и добавляет к телу новую информацию. В этом примере добавляется к телу ответа добавляется текущее время

В этом примере миддлвара Timestamp принимает на вход приложение Rack и перехватывает его ответ. Если статус ответа равен 200 (успешный ответ), миддлвара добавляет к телу ответа текущую дату и время в виде строки.

Приложение с базовой авторизацией

Запуск и запрос с авторизацией

Тестирование Rack-приложений

Запуск выполняется командой ruby test.rb

Мидлвары Rack

Rack предоставляет различные готовые middleware для улучшения функционала, вот некоторые из них:

Сам Rack поставляется со следующим промежуточным программным обеспечением:

  • Rack::Files для раздачи статических файлов.
  • Rack::Events для создания удобных хуков при получении запроса и отправке ответа.
  • Rack::Head для возврата пустого тела для HEAD-запросов.
  • Rack::Lock для сериализации запросов с помощью мьютекса.
  • Rack::Reloader для перезагрузки приложения, если были изменены файлы.
  • Rack::Runtime для включения в заголовок ответа времени, затраченного на обработку запроса.
  • Rack::ShowException для перехвата необработанных исключений и представления их в удобном виде.
  • Rack::MethodOverride для изменения метода запроса на основе переданного параметра.

Хелперы Rack

Rack предоставляет множество хелперов:

  • Rack::Request - обеспечивает разбор строки запроса и работу с несколькими частями.
  • Rack::Response - для удобной генерации HTTP-ответов и обработки cookie.
  • Rack::MockRequest и Rack::MockResponse для эффективного и быстрого тестирования Rack-приложений без реальных HTTP-сессий.
  • Rack::Directory - для раздачи файлов в директории.
  • Rack::MediaType - для разбора заголовков типа содержимого.
  • Rack::Mime - для определения типа содержимого на основе расширения файла.

Sinatra

Sinatra — это легковесный веб-фреймворк, построенный на основе Rack. Он предлагает простой и элегантный способ создания веб-приложений, предоставляя разработчикам возможность быстро разрабатывать RESTful API и небольшие веб-приложения.

Sinatra имеет минималистичный синтаксис, что делает его идеальным выбором для небольших проектов и прототипов. Фреймворк позволяет добавлять только необходимые компоненты, что позволяет создавать приложения, максимально соответствующие вашим требованиям. Также он поддерживает использование middleware, что позволяет комбинировать различные библиотеки и улучшать функциональность вашего приложения.

Пример простого приложения на Sinatra

Создаем директорию проекта:

Добавляем зависимости в Gemfile:

Создаем app.rb - точку входа в наше приложение:

Запускаем:

Наше приложение будет доступно по адресу http://localhost:4567, и на странице будет выведена строка Hello, World!

Заключение

В этом уроке мы познакомились с основами Rack, его компонентами и концепцией middleware. Мы также рассмотрели Sinatra как легковесный фреймворк, построенный на основе Rack.