2011-05-23 14 views
10

我正在尝试将Devise集成到我的应用程序中。我需要在页面顶部实现登录表单(我已将此表单实现为布局页面),并且已实施包含注册表单的注册。 但是,当我尝试提交不正确的注册数据时,它显示两种形式的验证错误。设计。在同一页登记和登录

+0

你能展示相关视图/控制器代码吗? – 2011-05-23 13:09:02

+0

[检查我的答案](http://stackoverflow.com/a/17001874/1297435)关于这种情况。 – 2013-08-30 08:56:36

回答

6

没有更多的信息,很难猜测问题是什么。我已经找到了维基网页是真正有用的(并且越来越等等),虽然你可能已经他们看了过来:

Devise Wiki Pages

两个页面,可能会满足您的要求:

Display a custom sign_in form anywhere in your app

Create custom layouts

希望这会有所帮助!

- FF

+0

我发现它不依赖于设计的问题。我更改每个窗体的对象名称,并且它可以正常工作。 – 2011-06-01 09:11:51

+1

@VitalyAksionchyk你能更详细地描述你做了什么吗? – flynfish 2012-07-24 00:29:51

+0

对我来说,从'simple_form_for(“User”,...'到'simple_form_for(“user”,...'帮助 – mirelon 2013-06-12 14:53:55

0

你应该有两个页面上的形式 - 一个用于注册和一个用于注册。如果你想要一个表单和多个可能的动作,你需要一个按钮来处理客户端,并根据你想创建一个用户或者一个会话来改变表单的动作&方法到适当的路由。

如果你认为你已经这样做了,那么问题几乎肯定存在于你的代码中。如果你想和我们分享,我们也许可以指出你可能错过的东西。

3

看到这两种形式的验证错误的问题源于2件事情。首先,设计表单使用通用的“资源”帮手。这将创建一个用户对象,并且同一个用户对象用于注册和登录表单。其次,设计错误通常使用'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用于注册。这样可以防止其他人显示错误信息。请注意,建议在登录页面上放置这两个表单(并且可能会将默认注册页面重定向到登录页面),因为默认情况下登录尝试失败将重定向到登录页面。