JSON格式在rails中错误地发布到/创建

时间:2012-02-27 19:09:24

标签: ruby

使用rails 2.3.8。

我得到了这个:

[
    [0] "0",
    [1] {
            "name" => "Section",
        "contents" => {
            "0" => {
                "name" => "RENAMED!",
                  "id" => "1"
            }
        }
    }
]

注意[0]和[1]

但在我的帖子中,我将JSON格式化为:

 [ {
              "name":"Section",
              "contents":[
                {
                  "id":1,
                  "name":"RENAMED!"
                }
              ]
            }, .. more of this type of structure [

那么,为什么rails会添加额外的数组呢?

以下是我发布对象的方式:

$j.ajax({
type: "POST",
url: 'http://url/objects/create/',
dataType: 'text',
async: false,
data: data_obj,
success: function () {
        alert("sent");
}
});

更新

data_obj = {
    "my_object":{
        "name":"hello there, I am JSON!",
        "template_id":1,
        "variables":{
            "hello":"there",
            "me":"you"
         },
        "sections":[
        {
          "name":"Section",
          "contents":[
            {
              "id":1,
              "name":"RENAMED!"
            }
          ]
        },
        {
          "name":"section2",
          "contents":[
            {
              "name":"something",
              "body":"nothing"
            },
            {
              "id":2,
              "name":"I renamed you",
              "variables":{
                "hello":"i'm amazing"
              }
            }
          ]
        }
      ],
      "attachments":[
        {
          "media_id":1
        }
      ]
    }
}

1 个答案:

答案 0 :(得分:0)

Rails没有将额外的元素添加到json数组中。这是在浏览器上发生的。

仔细检查你的javascript,找出向数组中添加空元素的“边缘情况”。例如,如何初始化数组。

如果您不相信上述错误的位置,请在ajax调用之前添加断点并检查data_obj数组。

PS。它应该是一个数组,但你已将其命名为data_obj。你在某个时候把它当作一个对象吗?您是否将第一个元素设置为索引1? (这将是一个错误。)你应该只push值到数组上。

ADDED 我认为问题在于你不是以json的形式发送数据。 将数据发送到服务器的默认值是键/值对。

尝试

$j.ajax({
  type: "POST",
  url: 'http://url/objects/create/',
  dataType: 'text',  // what you are expecting to be returned from server
  async: false,
  data: {json: JSON.stringify(data_obj)},
  success: function () {
    alert("sent");
  }
});

post。您可能还需要设置mime类型。这篇文章展示了如何。

alt结构:

 ...
 data: {my_object: JSON.stringify(data_obj.my_object)},
 ...