2011-12-14 10 views
5

Próbuję wykonać niektóre połączenia Ajax do kontrolera, który odpowiada JSON.Rails Render JSON - Session Lost?

if session[:user] 
    render :json => "Some Data" 
else 
    render :json => "You are not logged in" 
end 

Po raz pierwszy akcja ta jest wywoływana przez authed użytkownika wszystko jest ok i session[:user] jest != nil. Po raz drugi zostanie wywołany to jest nil!

Wygląda na to, że tory tracą swoją sesję, gdy tylko wykonam render :json. Doszedłem do wniosku, że w pierwszych szynach telefonicznych zastępuje się nowy Cookie z *_session. W wyniku tego tory nie wiedzą o początkowej, automatycznej sesji.

Jeśli nie wyrenderuję odpowiedzi jako JSON, wszystko działa poprawnie.

Jak wymusić na szynach ustawienie tego samego identyfikatora sesji w stronach renderowanych JSON, tak jak w widokach normalnych?

+0

Tried wiele tutoriali na ten temat - wciąż ten sam problem – gorootde

Odpowiedz

8

Po sześciu dniach poszukiwań w końcu zrobiłem to:

Wygląda szynach niszczy sesję z powodu brakującego X-CSRF-Token nagłówku. Dodaję teraz w ten nagłówek w ajaxSend Hook jQuery:

$(document).ajaxSend(function(e, xhr, options) { 
    var sid = $("meta[name='csrf-token']").attr("content"); 
    xhr.setRequestHeader("X-CSRF-Token", sid); 
}); 

To działa teraz zgodnie z oczekiwaniami.

1

kładę, że w metodzie beforeSend:

function goAjax(urlAddress,dataObject,successFunction,errorFunction){ 
     $.ajax({ 
       type: "POST", 
       url: urlAddress, 
       beforeSend: function (xhr) { 
        xhr.setRequestHeader("X-CSRF-Token", $('meta[name=csrf-token]').attr('content')); 
       }, 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       processData: false, 
       data: JSON.stringify(dataObject), 
       context: document.body, 
       success: function(data,status){ successFunction(data,status);}, 
       error: function(data,status){ errorFunction()} 
     }); 
    } 

działa świetnie, jeśli nie trzeba używać innego sposobu żądania ajax (w ten sposób należy dodać beforeSend do wszystkich żądań ajax)