值不保存在会话数组中。
值不保存在会话数组中。
在我的控制器动作中,我初始化一个数组的会话并插入值。这些值是通过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] ) #这会一直打印当前的值,我希望它打印包括之前的值的列表 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!!!!'); } });
问题的原因是浏览器没有保存cookies,这解释了为什么每次会话都重新初始化。要确认这一点,可以在操作中添加以下代码:print "Session ID: #{request.session_options[:id]}",然后观察每次请求的会话ID是否更改。如果会话ID每次都更改,那么请检查浏览器的隐私设置,看看是否保存了任何cookies。
解决方法包括检查浏览器的隐私设置,确保浏览器保存cookies。也可以尝试使用不同的浏览器,或者在Firefox首选项>隐私中点击删除特定的cookies。另外,还可以尝试搜索应用程序相关的cookies,确保有一个针对应用程序的cookies。
如果会话ID在每次请求时都更改,那说明Rails为每个请求生成了一个新的会话,需要找出原因。可以查找应用程序.rb文件中是否有类似于config.action_controller.session = {:expire_after => 60*60}的行,以确定会话是否设置了过期时间。
另一个可能的原因是AJAX请求可能会阻止浏览器发送cookie信息。可以尝试在没有使用AJAX的情况下进行请求,看看是否正常工作。也可以参考stackoverflow上的相关问题,了解关于HTTP cookies和AJAX请求的更多信息。
感谢scott的帮助,已经更新了下面的答案。
在上述内容中,作者分享了自己解决一个问题的经验。问题的原因是,在发送Ajax请求之前,作者没有为令牌设置请求头,因此Rails在没有令牌的情况下接收到数据,因此会将其视为每个请求的新对象。为了解决这个问题,作者提供了一个在发送请求之前设置请求头的方法。具体的解决方法是在Ajax函数中添加beforeSend选项,并在其中设置请求头的X-CSRF-Token字段。
作者还分享了他的Ajax函数,该函数已经经过修改以解决问题。函数首先定义了一个名为myobj的对象,然后通过Ajax发送了一个POST请求,将myobj对象以JSON格式作为数据发送。在发送请求之前,通过beforeSend选项设置了请求头的X-CSRF-Token字段。在成功或失败的回调函数中,作者分别输出了相应的消息。
最后,作者表示他从未遇到过类似的问题,但建议大家在开发中要注意这个问题。他同时表示对作者解决问题的方法感到高兴。
通过上述内容,我们可以得出问题的原因是没有在发送Ajax请求之前设置请求头,导致Rails无法正确识别请求并保存对应的值。解决方法是在发送请求之前通过beforeSend选项设置请求头的X-CSRF-Token字段。