В КУРСЕ?

Разбираемся в теме

Название пустое, форма вернулась: как запрос в Rails проходит проверку перед сохранением

В приложении Ruby on Rails пользователь может отправить форму и снова увидеть её на экране. Это не обязательно означает потерю запроса: приложение могло обнаружить неверные данные и предложить исправление. Чтобы понимать такое поведение, полезно проследить один простой пример. В условном каталоге настольных игр у каждой записи должно быть непустое название.

Маршрут выбирает действие, но не проверяет содержание за модель

Запрос сначала сопоставляется с маршрутом, который направляет его к нужному действию контроллера. Показ новой формы и попытка создать запись относятся к разным действиям. При открытии формы приложение может подготовить объект в памяти, ещё ничего не сохраняя в базе. После отправки контроллер получает разрешённые параметры и создаёт объект с введёнными значениями. В нашем примере это название игры. Само существование такого объекта не доказывает, что запись уже появилась в базе. Нужно отдельно проследить попытку сохранения и её результат.

Правило модели должно быть задано явно

Если модель содержит проверку обязательного названия, обычная попытка сохранения запускает эту проверку. Строка только из пробелов не удовлетворяет требованию наличия содержательного значения. При провале проверки объект получает сведения об ошибках, а некорректная запись не сохраняется этим обычным способом. Контроллер может использовать результат попытки, чтобы выбрать ответ пользователю. Важно не приписывать Rails знание правил каталога без их определения: фреймворк предоставляет механизм, а требование к названию задаёт разработчик. Проверка удобства формы в браузере также не заменяет правило на стороне приложения.

Повторный показ формы и перенаправление имеют разный смысл

При ошибке удобно отобразить форму с тем же объектом и сообщениями о проблеме: пользователь видит, что нужно исправить. Отрисовка шаблона не выполняет автоматически действие контроллера, название которого похоже на название шаблона. Она формирует ответ в текущем запросе. При успешном сохранении часто отправляют перенаправление на страницу созданной записи, после чего браузер делает новый запрос. Само перенаправление тоже не сохраняет объект: это отдельный шаг после успешной операции. Если смешать эти действия, легко принять смену страницы за подтверждение записи в базе.

Попробуйте на практике

Нарисуйте путь двух вымышленных запросов на бумаге. Устанавливать Ruby, создавать сайт и запускать код не нужно; правило модели для обоих случаев одинаковое: название обязательно.

  1. Изобразите четыре области: маршрут, контроллер, объект модели и база данных. Добавьте отдельно ответ браузеру, чтобы не смешивать его с сохранением.
  2. Для первого запроса задайте название только из пробелов. Отметьте создание объекта в памяти, неуспешную проверку и возврат формы со сведениями об ошибке.
  3. Для второго запроса задайте непустое название придуманной игры. При отсутствии других препятствий покажите успешное сохранение, затем перенаправление и новый запрос страницы записи.
  4. Проверьте каждую стрелку: где определяется правило, где выбирается ответ и на каком шаге действительно меняется база. Не рисуйте сохранение как следствие одного лишь показа страницы.

Как проверить результат. Первая ветка заканчивается формой с ошибкой без новой записи. Вторая включает успешное сохранение до перенаправления. Объект в памяти, содержимое базы и браузерный ответ обозначены как разные части процесса.

Частые вопросы

Если форма отображается повторно, запускается ли заново действие создания?

Обычная отрисовка шаблона внутри текущего запроса сама по себе не вызывает другое действие контроллера. Новый запрос возникает при отдельном обращении браузера, например после перенаправления.

Валидация модели является полной защитой всего приложения?

Нет. Она решает определённую задачу проверки данных. Полномочия, разрешённые параметры, ограничения базы и другие вопросы проектирования требуют собственных решений.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

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

Зарегистрироваться
← К списку материалов