在我的控制器操作中,我初始化一个数组会话并插入值。这些值来自客户端通过ajax,因此在将这些值插入数组时不会刷新页面。但是每次它都会初始化新会话而不是插入到同一个定义的会话时。这是我的代码
控制器
def receive_tags
parser = Yajl::Parser.new
@hash = parser.parse(request.body.read)
log=Logger.new(STDOUT)
log.error(@hash)
session[:tags]||=[]
session[:tags] << @hash["tag"]
unless session[:tags].empty?
log.error(session[:tags] ) #this keeps printing the current value i was expecting it to print a list of values including the previous
end
render :nothing=>true
end
Ajax
var myobj={tag:"mytag"};
$.ajax({
url: 'ips/receive_tags',
type: 'post',
contentType: 'application/json; charset=UTF-8',
accept: 'application/json',
dataType: 'json',
data:JSON.stringify(myobj),
success: function(res) {
if (res.ImportResponse !== void 0) {
console.log('Success: ' + res);
} else if (res.Fault !== void 0) {
console.log('Fault: ' + res);
}
},
error: function() {
console.error('error!!!!');
}
});
答案 0 :(得分:1)
这听起来好像浏览器没有保存cookie,这可以解释您每次重新初始化会话的行为。要确认这一点,您可以
print "Session ID: #{request.session_options[:id]}"
在您的操作中并查看每个请求的会话ID是否更改。如果是,请检查您的浏览器隐私设置,看看它是否保存了任何cookie。
答案 1 :(得分:1)
最后我想通了,问题是我没有在发送ajax调用之前设置令牌的请求头,因此Rails在没有令牌的情况下接收数据,因此保持假设它是每个请求的新对象。你可以阅读更多here。设置请求标题添加
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
}
下面是我的ajax功能
var myobj={tag:"mytag"};
$.ajax({
url: 'ips/receive_tags',
type: 'post',
contentType: 'application/json; charset=UTF-8',
accept: 'application/json',
dataType: 'json',
data:JSON.stringify(myobj),
beforeSend: function(xhr) {
xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
}
success: function(res) {
if (res.ImportResponse !== void 0) {
console.log('Success: ' + res);
} else if (res.Fault !== void 0) {
console.log('Fault: ' + res);
}
},
error: function() {
console.error('error!!!!');
}
});