在自定义Devise登录表单中显示验证错误

时间:2015-03-11 12:34:05

标签: authentication ruby-on-rails-4 devise spree spree-auth-devise

目前,我正在使用Spree Commerce构建Rails平台,我需要两个Devise登录表单。

默认的Devise登录表单已经实现。对于第二个(自定义)Devise表单,我创建了以下视图:

global_login.html.erb

<div class="inner">
  <h2 class="large-margin">
    Login
   </h2>
   <%= form_for(Spree::User.new, :url => spree_login_path) do |f| %>
     <%= f.error_messages %>
     <%= f.email_field :email, {:value => params[:email], :placeholder => 'Email address', :class => 'input'} %>
     <%= f.password_field :password, {:placeholder => 'Password', :class => 'input'} %>
     <%= f.submit 'Login', :class => 'submit' %>
  <% end %>
</div>

此视图会显示Devise登录表单。但是,每次提交表单时,我都会被重定向到默认的Devise视图,其中显示验证错误。

有人知道这个问题的解决方案吗?

干杯!

1 个答案:

答案 0 :(得分:1)

我找到了解决此问题的方法。我在其中一个名为“inside_cart”的表单中添加了一个参数。当请求发送到#create方法时,我会检查param是否存在。

我覆盖了Spree :: UserSessionsController #create方法,如下所示:

Spree::UserSessionsController.class_eval do
  layout false

  def create
    authenticate_spree_user!
      if spree_user_signed_in?
        respond_to do |format|
          format.html {
            flash[:success] = Spree.t(:logged_in_succesfully)
            redirect_back_or_default(after_sign_in_path_for(spree_current_user))
          }
          format.js {
            user = resource.record
            render :json => {:ship_address => user.ship_address, :bill_address => user.bill_address}.to_json
          }
        end
      else
        if params[:spree_user] && params[:spree_user][:inside_cart]
          flash.now[:error] = t('devise.failure.invalid')
          render :new, layout: false
        else
          flash.now[:error] = t('devise.failure.invalid')
          render 'spree/users/global_login', layout: 'spree/layouts/spree_application'
        end
      end
    end
  end