Я пытаюсь интегрировать Devise в свое приложение. Мне нужно внедрить форму входа в начало страницы (я внедрил эту форму в страницу макета), и я внедрил регистрацию, которая содержит регистрационную форму. Но он показывает ошибки проверки для обеих форм, когда я пытался отправить неверные данные регистрации.
Разрабатывают. Регистрация и вход на той же странице
Ответ 1
Без дополнительной информации трудно догадаться, в чем проблема. Я нашел страницы Wiki действительно полезными (и тем более), хотя вы, возможно, уже просмотрели их:
Две страницы, которые могут иметь отношение к вашим потребностям:
Отобразить пользовательскую форму sign_in в любом месте приложения
Надеюсь, это поможет!
- ff
Ответ 2
Проблема просмотра ошибок проверки для обеих форм связана с двумя вещами. Во-первых, при разработке форм используется универсальный "ресурсный" помощник. Это создает объект User, и тот же пользовательский объект используется как для знака, так и для знака. Во-вторых, ошибки разработки обычно отображаются с помощью "devise_error_messages!". хелпер, который использует тот же общий ресурс.
Чтобы иметь вход и зарегистрироваться на одной странице, вам нужно создать разные пользовательские объекты для каждой формы и новый способ отображения сообщений об ошибках.
Сначала вы должны создать свой собственный контроллер регистрации (в приложении/контроллерах/пользователям/)
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 для входа. Это предотвратит появление сообщений об ошибках в одном. Обратите внимание, что рекомендуем размещать обе формы на вашей странице входа (и, возможно, переадресовывать страницу по умолчанию на страницу входа в систему), потому что по умолчанию попытка неудачного входа будет перенаправлена на страницу входа.
Ответ 3
На странице должно быть две формы: одна для регистрации и одна для регистрации. Если вам нужна одна форма и несколько потенциальных действий, вам понадобится пара кнопок, которые обрабатывают клиентскую сторону и изменят действие и метод формы на соответствующий маршрут, в зависимости от того, вы хотите создать пользователя или сеанс.
Если вы думаете, что сделали это уже, проблема почти наверняка лежит в вашем коде. Если бы вы поделились им с нами, мы могли бы указать на то, что вы, возможно, пропустили.