设计。 注册并登录同一页面

我正在尝试将Devise集成到我的应用程序中。 我需要在页面顶部实现登录表单(我已将此表单实现到布局页面)并且我已实现包含注册表单的注册。 但是当我尝试提交错误的注册数据时,它会显示两种表单的validation错误。

没有更多信息,很难猜出问题是什么。 我发现Wiki页面确实非常有用(并且越来越多),尽管您可能已经查看了它们:

设计维基页面

两页可能与您的需求相关:

在应用中的任意位置显示自定义sign_in表单

创建自定义布局

希望这可以帮助!

– ff

看到两种forms的validation错误的问题源于两件事。 首先,设计表单使用通用的“资源”帮助程序。 这将创建一个User对象,并且同一用户对象将用于注册和登录表单。 其次,设计错误通常使用’devise_error_messages!’显示。 帮助器使用相同的共享资源。

要在同一页面上登录并注册,您需要为每个表单创建不同的用户对象,以及显示错误消息的新方法。

首先,您需要创建自己的注册控制器(在app / 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 

#{sentence}

    #{messages}
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个用于登录。这将防止错误消息显示在另一个中。 请注意,建议将两个表单放在登录页面上(并且可能将默认注册页面重定向到登录页面),因为默认情况下,失败登录尝试将重定向到登录页面。

您应该在页面上有两个表单 – 一个用于注册,另一个用于注册。 如果您需要单个表单和多个潜在操作,则需要一些按钮来处理客户端,并根据您要创建用户或会话的方式将表单的操作和方法更改为适当的路由。

如果你认为你已经这样做了,问题几乎肯定在你的代码中。 如果你要与我们分享,我们可能会指出你可能错过的东西。