Ваше ожидание полностью неверно, но довольно распространено среди начинающих Rails.
В Аромат Rails REST GET /clients/new
- это просто страница, которая содержит форму для создания нового ресурса.Поскольку это запрос GET, он идемпотент - это означает, что он не имеет состояния и выглядит одинаково для всех посетителей.
Когда вы отправляете форму, ваш браузер отправляет запрос POST на /clients
.И снова в REST со вкусом Rails вы создаете ресурс.
Если проверка не пройдена, rails просто отображает ответ, содержащий форму.Это НЕ ДОЛЖНО перенаправлять пользователя, поскольку то, что вы видите, является результатом неидемпотентного запроса POST.Это не тот же ресурс, что и GET /clients/new
.
На самом деле render 'new'
- это всего лишь ярлык для render 'app/views/clients/new.html.erb'
.Две конечные точки разделяют точку зрения - больше ничего.
Почему это?Разве «render» не должен ничего менять из URL?
Опять полностью ошибочно.render
не меняет URL.Отправка формы ранее изменила URL в браузере.Render просто отображает представление и возвращает его как тело ответа.Посмотрите журналы вашего Rails-приложения, если хотите получить представление о том, как на самом деле работает обмен между клиентом и сервером.
Вы можете сопоставить это с redirect_to
, который отправляет заголовок location
иправильный код ответа (302), который перенаправит браузер на новое место.
Это создает проблемы при обновлении страницы, поскольку у меня нет представления «индекс», и вместо отображения«новый» вид, как и должно быть.
Чтобы решить эту проблему, вам нужно добавить действие индекса, которое может быть простым перенаправлением на /clients/new
.Когда вы перезагружаете страницу, вы отправляете запрос GET на /clients
, который должен обработать индекс.
Я бы действительно рекомендовал вам попробовать просто создать приложение для лесов с рельсами, чтобы вы получили представление о том, как эти рельсысоглашения делают простые операции CRUD, прежде чем вы начнете навязывать свои собственные идеи.