每次我想用 jQuery 将一组 JSON 对象发布到 Rails 时,我都会遇到这个问题。 如果我对数组进行字符串化,我可以看到 jQuery 正在正常工作:
"shared_items"=>"[{\"entity_id\":\"253\",\"position\":1},{\"entity_id\":\"823\",\"position\":2}]"
但如果我只是将数组作为 AJAX 调用的数据发送,我会得到:
"shared_items"=>{"0"=>{"entity_id"=>"253", "position"=>"1"}, "1"=>{"entity_id"=>"823", "position"=>"2"}}
而如果我只是发送一个普通数组,它就可以工作:
"shared_items"=>["entity_253"]
为什么 Rails 将数组更改为那个奇怪的哈希?想到的唯一原因是 Rails 无法正确理解内容,因为这里没有类型(有没有办法在 jQuery 调用中设置它?):
Processing by SharedListsController#create as
谢谢!
更新:
我将数据作为数组而不是字符串发送,并且该数组是使用 .push()
函数动态创建的。尝试使用 $.post
和 $.ajax
,结果相同。
最佳答案
如果有人偶然发现并想要更好的解决方案,您可以在 .ajax 调用中指定“contentType: 'application/json'”选项,并让 Rails 正确解析 JSON 对象,而不会将其乱码为整数键散列具有全字符串值。
所以,总而言之,我的问题是:
$.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}]}
});
导致 Rails 将事物解析为:
Parameters: {"shared_items"=>{"0"=>{"entity_id"=>"253", "position"=>"1"}, "1"=>{"entity_id"=>"823", "position"=>"2"}}}
而这(注意:我们现在正在对 javascript 对象进行字符串化并指定内容类型,因此 rails 将知道如何解析我们的字符串):
$.ajax({
type : "POST",
url : 'http://localhost:3001/plugin/bulk_import/',
dataType: 'json',
contentType: 'application/json',
data : JSON.stringify({"shared_items": [{"entity_id":"253","position":1}, {"entity_id":"823","position":2}]})
});
在 Rails 中生成一个不错的对象:
Parameters: {"shared_items"=>[{"entity_id"=>"253", "position"=>1}, {"entity_id"=>"823", "position"=>2}]}
这适用于我在 Rails 3 中的 Ruby 1.9.3 上。
关于jquery - Rails 无法正确解码来自 jQuery 的 JSON(数组变成带有整数键的散列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6410810/