这个问题有点老了,但是我今天自己解决了这个问题,这就是我想出的答案:我相信这是jQuery的错,但这只是在做自然而已。但是,我确实有一种解决方法。
给定以下jQuery ajax调用:
$.ajax({
type : "POST",
url : 'http://localhost:3001/plugin/bulk_import/',
dataType: 'json',
data : {"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}]}
});
jQuery将发布的值将类似于以下内容(如果您在Firebug-of-choice中查看“请求”)将为您提供如下形式的表单数据:
shared_items%5B0%5D%5Bentity_id%5D:1
shared_items%5B0%5D%5Bposition%5D:1
如果您使用CGI.unencode,您将获得
shared_items[0][entity_id]:1
shared_items[0][position]:1
我相信这是因为jQuery认为JSON中的那些键是表单元素名称,并且应该将它们视为您有一个名为“ user [name]”的字段。
因此,它们进入了您的Rails应用程序,Rails看到了括号,并构造了一个散列来保存字段名称的最里面的键(jQuery“有帮助地”添加的“ 1”)。
无论如何,我通过以下方式构造ajax调用来解决此问题:
$.ajax({
type : "POST",
url : 'http://localhost:3001/plugin/bulk_import/',
dataType: 'json',
data : {"data": JSON.stringify({"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}])},
}
});
这迫使jQuery认为此JSON是一个您想完全传递的值,而不是它必须接受并将所有键转换为表单字段名称的Javascript对象。
但是,这意味着Rails方面有些不同,因为您需要在params [:data]中显式解码JSON。
但这没关系:
ActiveSupport::JSON.decode( params[:data] )
TL; DR:因此,解决方案是:在jQuery.ajax()调用的data参数中,{"data": JSON.stringify(my_object) }
显式执行操作,而不是将JSON数组输入jQuery(错误地猜测要使用它做什么)。