2011-12-14 69 views
5

我正在嘗試對JSON響應的控制器進行一些Ajax調用。Rails呈現JSON - 會話丟失?

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

第一次這個動作得到由authed用戶都堪稱是確定並session[:user]!= nil。 第二次被稱爲nil

所以它似乎像鐵軌是失去它的會議,只要我做render :json。我發現在第一個電話欄內覆蓋了一個新的*_session-cookie。因爲鐵路不知道最初的,冒充的會話。

如果我不呈現響應爲JSON一切正常。

如何強制rails在JSON呈現的頁面中設置與正常視圖中相同的sessionid?

+0

嘗試關於這個問題的多個教程 - 仍然是同樣的問題 – gorootde 2011-12-19 23:21:22

回答

8

搜索後六天我終於成功了:

好像鐵軌破壞,因爲缺少X-CSRF-Token頭的會話。我在ajaxSend掛鉤的jQuery現在加入這個頭:

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

它的工作作爲目前預計。

1

我把在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()} 
     }); 
    } 

的偉大工程,如果你不需要使用Ajax請求的其他方式(這樣你應該添加beforeSend所有Ajax請求)