Сбой при проверке rails и проблема с кнопкой возврата браузера

#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-запрос к этому действию и обновить форму, чтобы указать, было ли это имя пользователя действительным.