Проблема обнаружения ошибок валидации для обеих форм связана с двумя вещами. Во-первых, при разработке форм используется универсальный помощник «ресурса». Это создает объект User, и тот же пользовательский объект используется как для регистрации, так и для входа в форму. Во-вторых, ошибки устройства обычно отображаются с помощью devise_error_messages! помощник, который использует тот же общий ресурс.
Чтобы войти и зарегистрироваться на одной и той же странице, необходимо создать разные пользовательские объекты для каждой формы и новый способ отображения сообщений об ошибках.
Прежде всего, вам нужно создать свой собственный контроллер регистрации (в приложении / controllers / users /)
class Users::RegistrationsController < Devise::RegistrationsController
include DevisePermittedParameters
protected
def build_resource(hash=nil)
super
# Create an instance var to use just for the sign up form
@sign_up_user = self.resource
end
end
И соответственно обновите файл маршрутов
devise_for :users, controllers: {
registrations: 'users/registrations'
}
Далее вам понадобятся ваши собственные сообщения об ошибках и помощники по ресурсам. Создайте нового помощника, такого как devise_single_page_helper.rb, и добавьте следующее:
module DeviseSinglePageHelper
def devise_error_messages_for_same_page(given_resource)
return "" if given_resource.errors.empty?
messages = given_resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
sentence = I18n.t("errors.messages.not_saved",
count: given_resource.errors.count,
resource: given_resource.class.model_name.human.downcase)
html = <<-HTML
<div id="error_explanation">
<h2>#{sentence}</h2>
<ul>#{messages}</ul>
</div>
HTML
html.html_safe
end
def sign_up_user
@sign_up_user ||= User.new(username: 'su')
end
def sign_in_user
@sign_in_user ||= User.new(username: 'si')
end
end
Наконец, по вашему мнению, обновите ваши формы следующим образом:
-# The sign up form
= simple_form_for(sign_up_user, url: registration_path(resource_name)) do |f|
-#...
= devise_error_messages_for_same_page(sign_up_user)
-# The sign in form
= simple_form_for(sign_in_user, url: sessions_path(resource_name)) do |f|
#...
= devise_error_messages_for_same_page(sign_in_user)
Все это вместе дает вам 2 разных объекта - 1 для регистрации и 1 для входа. Это предотвратит отображение сообщений об ошибках из одного в другом. Обратите внимание, что рекомендуется размещать обе формы на странице входа (и, возможно, использовать страницу регистрации по умолчанию, перенаправляющую на страницу входа), поскольку по умолчанию неудачная попытка входа перенаправляет на страницу входа.