我正在发布一个长嵌套列表,看起来像 Firebug 上的这个图像:
long nested list http://i.imm.io/1m4s2.jpeg
虽然您可以在同一张图片中看到帖子成功,但日志中唯一显示的是以下几行:
[2013-12-11 20:50:37]错误SystemStackError:堆栈级别太深
/home/fotanus/.rvm/gems/ruby-2.0.0-p247/gems/rack-1.5.2/lib/rack/utils.rb:527
Rails 上似乎没有执行任何操作。
长列表将通过以下行发送:
$.ajax({ 类型: "POST", url: '/projects', 数据: JSON.stringify({ sortd_items: Sorted_items }) })
其中 sorted_items
打印在图像中,由递归函数生成。
为什么会发生这种情况,我怎样才能让事情按预期进行?
编辑:使用较小的列表似乎可行:
于 2013-12-11 21:01:08 -0200 开始为 127.0.0.1 发布“/projects”
由 ProjectsController 处理#create as */*
参数:{"{\"sortd_items\":"=>{"\"2\","=>{"\"5\","=>[{",\"6\","=>[ {",\"7\","=>[{",\"8\","=>[{",\"3\","=>{"\"10\","=>[ {",\"10\","=>[{",\"4\","=>[{",\"5\","=>[{",\"6\","= >[{",\"7\","=>[{",\"8\","=>[{",\"3\","=>{"\"10\","= >[{",\"10\","=>[{",\"4\","=>[{",\"9\","=>{"\"11\","= >[{",\"12\","=>{"\"13\","=>[{",\"14\","=>[{",\"15\","= >[{",\"13\","=>[{",\"14\","=>[{",\"15\","=>[{",\"11\", "=>[{",\"12\","=>{"\"13\","=>[{",\"14\","=>[{",\"15\", "=>[{",\"13\","=>[{",\"14\","=>[{",\"15\","=>[{"}"=>nil }]}]}]}]}]}]}}]}]}]}]}]}]}]}}]}}]}]}]}}]}]}]}]}]}] }]}}]}]}]}]}}}
1 毫秒内完成 400 个错误请求
但我需要让它也适用于大型列表。
最佳答案
Rack utils.rb 方法 to_params_hash
确实会递归。这样做是因为,根据 http://api.jquery.com/jQuery.ajax/ , $.ajax()
将 data:
变量视为包含 URL 查询参数的字符串。
总而言之,Rails 将嵌套结构中的每个键视为您希望在 params
哈希中看到的内容。你不知道;您只需将所有 JSON 作为字符串传递,这样您自己的方法就可以安全地将其解码为 JSON,使用(可能)不会滥用堆栈的 C JSON 库。
每jQuery ajax data two variables ,您也许可以将字符串填充到哈希中并传递哈希:
var dataObj = {};
dataObj[json]=JSON.stringify({ sortd_items: sorted_items });
$.ajax({ ... data: dataObj });
现在,$.ajax()
将看不到字符串,不会将其转换为查询参数,也不会破坏 Rack。
关于jquery - 在 ajax 请求中发布长嵌套列表时堆栈级别太深,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20531663/