目前,我正在使用Spree Commerce构建一个Rails平台,我需要两个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>
此视图显示设计登录表单。但是,每次提交表单时,我都会被重定向到显示验证错误的默认设计视图。
有人知道这个问题的解决方案吗?
干杯!
我找到了解决此问题的方法。我在一个名为"inside_cart"的表单中添加了一个参数。当请求发送到 #create 方法时,我检查参数是否存在。
我覆盖了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