设计ajax标志处理轨道故障4

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... 来设法获得所需的行为...我仍然想知道这是否是正确的方法,或者我是否遗漏了某些东西

Jon*_*han 4

可能是你的 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)