设计ajax登录处理rails上的故障4



我正试图在设计AJAX登录表单上接收登录失败事件。我已经覆盖了设计会话控制器,如下所示:

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-on-failure实际上从未在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未经授权,因此逻辑流程进入其他条件

最新更新