2011-12-14 12 views
5

estoy tratando de hacer algunas llamadas Ajax a un controlador que responde con JSON.Rieles Render JSON: ¿sesión perdida?

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

La primera vez que esta acción es llamado por un usuario authed todo está bien y es session[:user]!= nil. ¡La segunda vez que se llama es nil!

Parece que los rieles están perdiendo su sesión tan pronto como lo hago render :json. Descubrí que dentro de la primera llamada, los rieles anulan la *_session -cookie con una nueva. Como consecuencia de eso, no conoce la sesión inicial, autorizada.

Si no presento la respuesta como JSON todo funciona bien.

Cómo forzar a los rieles a establecer el mismo sessionid en páginas renderizadas JSON como en vistas normales?

+0

Probamos múltiples tutoriales sobre esto: sigue siendo el mismo problema – gorootde

Respuesta

8

Después de seis días de búsqueda que finalmente lo hicieron:

parece que los carriles destruye la sesión debido a la falta de cabecera X-CSRF-Token. Estoy añadiendo esta cabecera ahora en el ajaxSend gancho de jQuery:

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

Está funcionando como se espera ahora.

1

pongo que en el método 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()} 
     }); 
    } 

funciona muy bien si no es necesario utilizar la otra manera de la petición AJAX (de esta manera se debe añadir beforeSend a todas las peticiones Ajax)

Cuestiones relacionadas