Разрабатывают.Регистрация и вход на одной странице - PullRequest
10 голосов
/ 23 мая 2011

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

Ответы [ 3 ]

6 голосов
/ 01 июня 2011

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

Разработка страниц Wiki

Две страницы, которые могут соответствовать вашим потребностям:

Отображение пользовательской формы входа в любом месте вашего приложения

Создание пользовательских макетов

Надеюсь, это поможет!

- ff

3 голосов
/ 11 сентября 2014

Проблема обнаружения ошибок валидации для обеих форм связана с двумя вещами. Во-первых, при разработке форм используется универсальный помощник «ресурса». Это создает объект 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 для входа. Это предотвратит отображение сообщений об ошибках из одного в другом. Обратите внимание, что рекомендуется размещать обе формы на странице входа (и, возможно, использовать страницу регистрации по умолчанию, перенаправляющую на страницу входа), поскольку по умолчанию неудачная попытка входа перенаправляет на страницу входа.

0 голосов
/ 01 июня 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...