Мой стек - Rails, но проблема на самом деле не зависит от фреймворка
Метод REST говорит, что
В порядкечтобы увидеть форму редактирования для существующего пользователя:
GET: users/:id/edit
Чтобы обновить существующего пользователя:
PUT: users/:id
Что это означает для ошибок проверки
Это все разумно, кроме случаев, когда форму не удается проверить.Если форма не проверяет URL-адрес, на котором вы находитесь, это не users/:id/edit
URL-адрес, а вместо этого:
users/:id
Это вызывает две проблемы.Один - это навигация, а другой - что происходит, если пользователь обновляет форму:
Свежая форма редактирования:
Та же форма с ошибками - хотя URL и навигация предполагают, что мы где-то отличаемся
Визуально страница теперь сбивает с толку, поскольку навигация и URL предполагают, что пользовательне в форме редактирования, а вместо этого на странице resource#show
.
Что видит пользователь, если он обновляет форму теперь - совершенно другая страница
Она также имеетдругие последствия.Если пользователь разочарован и просто хочет сбросить форму, его инстинкт будет обновлять страницу.Если они это сделают, хотя окажутся на странице resource#show
, а не на странице resource#edit
.
Наивно мы можем перенаправить неверную отправку обратно в resource#edit
URL.Если мы сделаем это, хотя мы не сможем (по умолчанию в Rails) показать им ошибки в форме, которую они только что отправили, поскольку они хранятся в памяти.
Возможные решения
Насколько я вижу, есть два способа решения этой проблемы:
- Когда
PUT users/:id
не удается проверить: сериализовать объект user
и сохранить его в сеансе.Перенаправьте на GET users/:id/edit
, а затем отмените сериализацию объекта на следующей странице, чтобы отобразить ошибки - выглядит грязно - Измените маршрут так, чтобы
PUT
перешел на users/:id/edit
вместо users/:id
- также чувствует себя грязно .
Вопрос
Каков наиболее подходящий способ решения этой проблемы?Я чувствую, что подход сериализации, вероятно, имеет больше смысла, но так как он не является частью ядра Rails, я чувствую, что что-то упустил.Я знаю, что я не первый, кто занимается этим, и меня интересуют подходы других