值不保存在会话数组中。

8 浏览
0 Comments

值不保存在会话数组中。

在我的控制器动作中,我初始化一个数组的会话并插入值。这些值是通过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!!!!');
    }
});

0
0 Comments

问题的原因是浏览器没有保存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的帮助,已经更新了下面的答案。

0
0 Comments

在上述内容中,作者分享了自己解决一个问题的经验。问题的原因是,在发送Ajax请求之前,作者没有为令牌设置请求头,因此Rails在没有令牌的情况下接收到数据,因此会将其视为每个请求的新对象。为了解决这个问题,作者提供了一个在发送请求之前设置请求头的方法。具体的解决方法是在Ajax函数中添加beforeSend选项,并在其中设置请求头的X-CSRF-Token字段。

作者还分享了他的Ajax函数,该函数已经经过修改以解决问题。函数首先定义了一个名为myobj的对象,然后通过Ajax发送了一个POST请求,将myobj对象以JSON格式作为数据发送。在发送请求之前,通过beforeSend选项设置了请求头的X-CSRF-Token字段。在成功或失败的回调函数中,作者分别输出了相应的消息。

最后,作者表示他从未遇到过类似的问题,但建议大家在开发中要注意这个问题。他同时表示对作者解决问题的方法感到高兴。

通过上述内容,我们可以得出问题的原因是没有在发送Ajax请求之前设置请求头,导致Rails无法正确识别请求并保存对应的值。解决方法是在发送请求之前通过beforeSend选项设置请求头的X-CSRF-Token字段。

0