2016-06-05 28 views
6

Ich versuche Anmeldefehler Ereignisse auf einem Gerät AJAX Anmeldeformular zu erhalten. Ich habe die devise Sitzungen Controller wie so überschrieben:Devise Ajax Anmeldung Fehler bei der Handhabung auf Schienen 4

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 

die json bei einem Fehler nie wirklich löst auf einem 401 unauthorized Antwort. Die js on sign_in_and_redirect funktioniert jedoch gut.

ist hier der Abschnitt meines js, wo ich eine Warnung erwarten zeigen:

$(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 
     } 
    }); 
}); 

EDIT - also ich es geschafft, durch Überprüfung für data.status == 200 statt data.success das gewünschte Verhalten zu erhalten ... Ich bin immer noch fragen, Wenn das der richtige Weg ist, oder wenn ich etwas vermisse

+0

Was passiert, wenn Sie 'return alert (XHR)', bevor Sie 'Block if' – Jonathan

+0

versuchen Sie auch' '.bind'ing ajax: complete "und setze das Ergebnis stattdessen dort ein z.B. '.on ('ajax: complete', Funktion (e, xhr, Status, Fehler) {alert (xhr);});' – Jonathan

+0

Aktualisierter Status zu Ihrem Problem? – Jonathan

Antwort

4

könnte es sein, dass Ihr Ajax Ihre success überhaupt nicht feuert. So versuchen, die anderen Ajax-Ereignisse Handhabung und Inspektion das Ergebnis Ihnen helfen, debuggen, wenn Sie nicht bereits getan haben:

$(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); 
    }); 
}); 
0

ich es geschafft, dieses Problem zu lösen, indem Sie den HTTP-Statuscode überprüft, wie so:

$(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 
     } 
    }); 
}); 
in nicht

wenn das Zeichen, data.status 401 nicht autorisiert und daher logisch Fluss in den sonst Zustand geht

Verwandte Themen