2011-12-14 32 views
5

Tôi đang cố gắng thực hiện một số cuộc gọi Ajax tới một bộ điều khiển đáp ứng với JSON.Rails Render JSON - Phiên bị mất?

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

Lần đầu tiên hành động này được gọi bởi một người sử dụng tất cả mọi thứ authed là ok và session[:user]!= nil. Lần thứ hai được gọi là nil!

Vì vậy, có vẻ như đường ray bị mất phiên đó ngay khi tôi làm render :json. Tôi đã tìm ra rằng trong các cuộc gọi đường ray đầu tiên ghi đè *_session -cookie với một cái mới. Kết quả của các đường ray đó không biết về phiên ban đầu, được xác thực.

Nếu tôi không trả lời như JSON mọi thứ hoạt động tốt.

Làm cách nào để buộc các đường ray đặt cùng một sessionid trong các trang được hiển thị JSON như trong chế độ xem bình thường?

+0

thử nhiều hướng dẫn về vấn đề này - vẫn là vấn đề tương tự – gorootde

Trả lời

8

Sau sáu ngày tìm kiếm cuối cùng tôi đã làm cho nó:

Có vẻ như đường ray phá hủy phiên vì thiếu X-CSRF-Token Header. Tôi đang thêm tiêu đề này ngay bây giờ trong số ajaxSend Móc của JQuery:

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

Nó hoạt động như mong đợi.

1

tôi đặt rằng trong phương pháp 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()} 
     }); 
    } 

hoạt động tuyệt vời nếu bạn không cần phải sử dụng cách khác yêu cầu ajax (theo cách này bạn nên thêm beforeSend mọi yêu cầu ajax)

Các vấn đề liên quan