Разрабатывают. Регистрация и вход на той же странице

Я пытаюсь интегрировать Devise в свое приложение. Мне нужно внедрить форму входа в начало страницы (я внедрил эту форму в страницу макета), и я внедрил регистрацию, которая содержит регистрационную форму. Но он показывает ошибки проверки для обеих форм, когда я пытался отправить неверные данные регистрации.

Ответ 1

Без дополнительной информации трудно догадаться, в чем проблема. Я нашел страницы Wiki действительно полезными (и тем более), хотя вы, возможно, уже просмотрели их:

Разработка страниц 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

На странице должно быть две формы: одна для регистрации и одна для регистрации. Если вам нужна одна форма и несколько потенциальных действий, вам понадобится пара кнопок, которые обрабатывают клиентскую сторону и изменят действие и метод формы на соответствующий маршрут, в зависимости от того, вы хотите создать пользователя или сеанс.

Если вы думаете, что сделали это уже, проблема почти наверняка лежит в вашем коде. Если бы вы поделились им с нами, мы могли бы указать на то, что вы, возможно, пропустили.