sno*_*ler 6 javascript ajax jquery ruby-on-rails devise
我试图在设计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
Run Code Online (Sandbox Code Playgroud)
失败的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
}
});
});
Run Code Online (Sandbox Code Playgroud)
编辑 - 所以我设法通过检查data.status == 200而不是data.success... 来设法获得所需的行为...我仍然想知道这是否是正确的方法,或者我是否遗漏了某些东西
可能是你的 ajaxsuccess根本没有触发你。因此,如果您还没有这样做,请尝试处理其他 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);
});
});
Run Code Online (Sandbox Code Playgroud)