Jquery 在ajax请求中发布长嵌套列表时堆栈级别太深

Jquery 在ajax请求中发布长嵌套列表时堆栈级别太深,jquery,ruby-on-rails,post,rack,nested-lists,Jquery,Ruby On Rails,Post,Rack,Nested Lists,我发布了一个很长的嵌套列表,看起来像firebug上的图片: 虽然您可以在同一图像中看到post成功,但日志上显示的唯一内容是以下几行: [2013-12-11 20:50:37]错误系统堆栈错误:堆栈级别太深 /home/fotanus/.rvm/gems/ruby-2.0.0-p247/gems/rack-1.5.2/lib/rack/utils.rb:527 而且似乎没有在Rails上执行任何操作 将通过以下行发送长列表: $.ajax({type:“POST”,url:'/pro

我发布了一个很长的嵌套列表,看起来像firebug上的图片:

虽然您可以在同一图像中看到post成功,但日志上显示的唯一内容是以下几行:


[2013-12-11 20:50:37]错误系统堆栈错误:堆栈级别太深
/home/fotanus/.rvm/gems/ruby-2.0.0-p247/gems/rack-1.5.2/lib/rack/utils.rb:527

而且似乎没有在Rails上执行任何操作

将通过以下行发送长列表:


$.ajax({type:“POST”,url:'/projects',data:JSON.stringify({sortd_items:sorted_items})})

其中,
sorted_items
打印在图像中,由递归函数生成

为什么会发生这种情况,我如何才能使事情按预期进行

编辑:使用较小的列表似乎有效:


于2013年12月11日21:01:08-0200启动了127.0.0.1的“项目”发布
由项目控制器处理#创建为*/*
““14.14”,”14.14“,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}]}]}]}]}]}}
在1ms内完成400个错误请求


但是我也需要使它能够处理大型列表。

Rack utils.rb方法
到_params_hash
确实会递归。之所以这样做,是因为,
$.ajax()
数据:
变量视为包含URL查询参数的字符串

总之,Rails将嵌套结构中的每个键视为希望在
params
hash中看到的内容。你没有;您只需要将所有JSON作为字符串传递,这样您自己的方法就可以安全地将其解码为JSON,使用(可能)不会滥用堆栈的C JSON库

根据,您可以将字符串填充到哈希中并传递哈希:

var dataObj = {};
dataObj[json]=JSON.stringify({ sortd_items: sorted_items });
$.ajax({ ... data: dataObj });

现在,
$.ajax()
不会看到字符串,不会将其转换为查询参数,也不会破坏Rack。

我认为这是正确设置ajax请求中的头的问题。您可以发布通过
JSON.stringify
输入的数据,但服务器不知道如何处理这些数据,除非您告诉它得到了什么。这应该可以解决这个问题:

$.ajax({
  type: 'POST',
  url: '/projects',
  contentType: 'json',
  data: JSON.stringify({ sortd_items: sorted_items })
})

你到底是如何发布这些数据的?看起来可能发生的情况是,您发布的对象不是特别深(可能深度约为5,最大),但它将进入Rack的某个部分,该部分尝试以不同的格式解析它,最终创建一个非常深的哈希,而不是它打算做的。也就是说,我认为您可能向服务器发送了一个编码不正确的查询字符串。@Bubbles
您到底是如何发布这些数据的?
我已经从我的javascript文件中复制了一行用于发布数据的内容-如果您需要其他内容,对不起,我无法理解。如何确切地检查字符串是否正确编码
JSON.stringfy
我不能保证吗?谢谢,我今晚会测试这个,我会告诉你明天会给你额外的100分,到时候我会告诉你的。