#ruby-on-rails #ruby-on-rails-4
#ruby-on-rails #ruby-on-rails-4
Вопрос:
У меня есть форма с несколькими шагами. После каждого шага соответствующая форма сохраняется в базе данных.
Второй шаг в форме — создать нового пользователя. Метод save_user сохраняет этого пользователя. К сожалению, если кто-то столкнется с несколькими ошибками проверки при попытке заполнить форму пользователя и захочет вернуться к шагу 1, ему придется нажать кнопку возврата браузера несколько раз (в зависимости от того, сколько раз проверка не удалась) и при этом, возможно, перезаписать сохраненного пользователя, когда он нажимает кнопку «Далее» / «Сохранить», чтобы снова перейти к следующему шагу.
Как я могу предотвратить это и создать лучший опыт для пользователя? Я бы хотел, чтобы по возможности не отображались экземпляры формы неудачной проверки, чтобы пользователь мог сразу вернуться к предыдущему шагу.
def save_user
...
if @user.save
redirect_to next_step_path
else
render 'new'
end
end
Ответ №1:
Отправка формы — это сообщение HTTP, что означает, что браузер увидит его как новый просмотр страницы. Я не могу придумать способ сделать это с помощью отправки формы, который не приводит к нескольким записям истории.
Лучше всего использовать JavaScript и HTML5 для проверки вашей формы перед отправкой. Проще всего, вы проверите свои имена пользователей и пароли на предмет ограничений длины / набора символов, проверите адрес электронной почты на действительность и другие простые проверки. Если большинство ваших пользователей работают в современных браузерах, и вы не возражаете против случайного многократного возврата, тогда вам понадобятся некоторые дополнительные атрибуты для ваших <input>
элементов.
Однако эти проверки не помогут вам обеспечить уникальность. Если вы хотите это сделать — чтобы убедиться, что имена пользователей уникальны, прежде чем пользователь нажмет «отправить», скажем, — тогда вам нужно будет использовать JavaScript. Вы бы создали новое действие контроллера, которое принимает имя пользователя в качестве параметра и возвращает true или false в зависимости от того, является ли имя свободным. Затем вы можете сделать AJAX-запрос к этому действию и обновить форму, чтобы указать, было ли это имя пользователя действительным.