Сервер приложения принимает HTTP-запрос и вызывает Rails через интерфейс Rack. Запрос проходит middleware, маршрутизатор выбирает контроллер и action. Контроллер обращается к моделям или сервисам и формирует ответ: HTML, JSON, redirect либо другой формат. Ответ возвращается через middleware серверу, который передаёт его клиенту.
Как устроен цикл обработки запроса в Ruby on Rails?
Путь от Puma и Rack через middleware и маршрутизацию к контроллеру, представлению и HTTP-ответу.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Обычный HTTP-запрос к Rails проходит несколько уровней. Не каждый из них обязан выполнять работу: кеширующий middleware, например, может вернуть ответ раньше контроллера.
- Сервер приложения, например Puma, принимает запрос. Перед ним может стоять Nginx, но это не обязательная часть Rails.
- Rack задаёт интерфейс вызова приложения: сервер передаёт окружение запроса, приложение возвращает статус, заголовки и тело. Rack — интерфейс и инфраструктура, а не отдельный сетевой сервер между Puma и Rails.
- Middleware оборачивают обработку: ведут журнал, обслуживают сессии, обрабатывают ошибки и выполняют другие задачи. Состав зависит от конфигурации.
- Router сопоставляет HTTP-метод и путь с маршрутом, выбирая action контроллера.
- Контроллер получает параметры, выполняет callbacks, вызывает модели или прикладные сервисы и формирует ответ.
- Представление нужно, если ответ собирается из шаблона. Для
render json:HTML-шаблон не обязателен. - Ответ проходит обратно через обёртки middleware и отправляется клиенту сервером. Rails и Rack
Минимальный прикладной пример при существующей модели Product:
# config/routes.rb
get '/products/:id', to: 'products#show'
# app/controllers/products_controller.rb
class ProductsController < ApplicationController
def show
product = Product.find(params[:id])
render json: { id: product.id, name: product.name }
end
end
Запрос GET /products/42 попадёт в show. При успехе получится JSON-ответ; если записи нет, возникнет ActiveRecord::RecordNotFound, далее работает настроенная обработка ошибок.
Модель не обязана участвовать в каждом запросе, а всю бизнес-логику не следует механически помещать в контроллер. Его роль — координировать обработку HTTP-взаимодействия. Обзор Action Controller