繁体   English   中英

设计ajax标志以处理Rails 4上的故障

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM