我正在尝试对一个以JSON响应的控制器进行一些Ajax调用。
if session[:user]
render :json => "Some Data"
else
render :json => "You are not logged in"
end
第一次由authed用户调用此操作时,一切正常,session[:user]
为!= nil
。
第二次被调用它是nil
!
所以看起来像我一样render :json
就会失去它的会话。我发现在第一个调用rails中用一个新的覆盖*_session
- cookie。因为rails不知道初始的,authed会话。
如果我没有将响应呈现为JSON,一切正常。
如何强制rails在JSON渲染页面中设置与普通视图中相同的sessionid?
答案 0 :(得分:9)
经过六天的搜索,我终于成功了:
似乎rails会因为缺少X-CSRF-Token
标头而破坏会话。我现在在ajaxSend
JQuery的Hook中添加此标题:
$(document).ajaxSend(function(e, xhr, options) {
var sid = $("meta[name='csrf-token']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", sid);
});
现在按预期工作了。
答案 1 :(得分: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请求),效果很好