[英]devise ajax sign in handling failure on rails 4
我试图在设计好的AJAX登录表单上接收登录失败事件。 我已经像这样重写了devise会话控制器:
class SessionsController < Devise::SessionsController
def create
resource = warden.authenticate!(:scope => resource_name, :recall => '#{controller_path}#failure')
sign_in_and_redirect(resource_name, resource)
end
def sign_in_and_redirect(resource_or_scope, resource=nil)
scope = Devise::Mapping.find_scope!(resource_or_scope)
resource ||= resource_or_scope
sign_in(scope, resource) unless warden.user(scope) == resource
return render :json => {:success => true}
end
def failure
return render :json => {:success => false, :errors => ["Login failed."]}
end
end
失败时的json从未真正触发401未经授权的响应。 但是sign_in_and_redirect上的js工作正常。
这是我的js部分,我希望显示警报:
$(document).on('click', '#login-btn', function(){
$("#login-modal").toggleClass("is-active");
$("form#login_user_form").bind("ajax:success", function(e, data, status, xhr) {
if (data.success) {
$("#login-modal").toggleClass("is-active");
} else {
return alert('failure!'); // this never happens
}
});
});
编辑-所以我设法通过检查data.status == 200
而不是data.success
来获得所需的行为...我仍然想知道这是否是正确的方法,或者我是否缺少某些东西
可能是您的ajax根本没有success
。 因此,请尝试处理其他ajax事件并检查结果,以帮助您调试(如果尚未这样做):
$(document).on('click', '#login-btn', function() {
$("#login-modal").toggleClass("is-active");
$("form#login_user_form").bind("ajax:success", function(e, data, status, xhr) {
if (data.success) {
$("#login-modal").toggleClass("is-active");
} else {
return alert('failure!');
}
}).bind("ajax:complete", function(e, xhr, status, error) { // <----
return alert(xhr);
});
});
我设法通过检查http状态代码来解决此问题,如下所示:
$(document).on('click', '#login-btn', function(){
$("#login-modal").toggleClass("is-active");
$("form#login_user_form").bind("ajax:success", function(e, data, status, xhr) {
if (data.status == 200) { // check for http status code here
$("#login-modal").toggleClass("is-active");
} else {
return alert('failure!'); // this now works on failed sign in
}
});
});
如果登录失败,则data.status
是401未经授权的,因此逻辑流程进入else条件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.