2016-06-05 48 views
6

Sto tentando di ricevere eventi di errore di accesso su un modulo di login AJAX elaborato. Ho sovresposta il controller sessioni testamentaria in questo modo:escogitare un segno ajax nella gestione degli errori su binari 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 

il JSON in caso di fallimento innesca mai realmente su una risposta non autorizzati 401. Il js su sign_in_and_redirect funziona bene però.

Ecco la sezione del mio js dove mi aspetta un avviso per mostrare:

$(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 - così sono riuscito a ottenere il comportamento desiderato controllando per data.status == 200 invece di data.success ... io non so ancora se questo è il modo giusto per farlo o se mi manca qualcosa

+0

Cosa succede quando si 'avviso di ritorno (XHR)' 'prima della if' bloccare – Jonathan

+0

prova anche a' '.bind'ing ajax: complete' e inserendo il risultato lì per esempio. '.on ('ajax: completa', funzione (e, xhr, stato, errore) {alert (xhr);});' – Jonathan

+0

Qualunque stato aggiornato sul problema? – Jonathan

risposta

4

Potrebbe essere che il tuo ajax non sta sparando il tuo success affatto. In modo da provare la manipolazione degli altri eventi AJAX e ispezionare il risultato di aiutare il debug se non l'hai già fatto:

$(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

sono riuscito a risolvere questo controllando il codice di stato HTTP in questo modo:

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

se il segno di cui viene a mancare, data.status è 401 flusso non autorizzato e quindi logico va alla condizione altrimenti