jquery - Rails 无法正确解码来自 jQuery 的 JSON(数组变成带有整数键的散列)

标签 jquery ruby-on-rails arrays json post

每次我想用 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/

相关文章:

java - 增强的 for 循环快捷方式

java - 我可以在不硬编码大小的情况下将 ArrayList 中的 Java 值分配给不同的变量吗?

jquery - 找不到 'jquery-ui' Rails 3.2

ruby-on-rails - Heroku 数据库 :push Error: time zone displacement out of range

ruby-on-rails - ActiveRecord 枚举返回 nil,即使它有值

python - 查找给定字符串中的所有 float 或整数

javascript - 使 Logo 在滚动时缩小到导航栏中

c# - 如何根据第一个下拉列表框的选定选项在 aspx 中禁用或启用第二个下拉列表

javascript - Bootstrap/JQuery - 单选按钮组事件函数

javascript - 慢动作与 jQuery