集合是序列化的,每个对象键是复数键,无法弄清楚原因

时间:2014-10-17 18:39:24

标签: ruby-on-rails serialization

我们有一个简单的api端点,其工作原理如下:

def index
  render json: Country.all
end

不幸的是,这给了我们这个输出:

{
    "countries" => [
        [0] {
            "countries" => {
                      "id" => 1,
                     "iso" => "US",
                    "iso3" => "USA",
                "iso_name" => "UNITED STATES",
                    "name" => "United States of Foo",
                 "numcode" => 840
            }
        },
        [1] {
            "countries" => {
                      "id" => 2,
                     "iso" => "CA",
                    "iso3" => "CAN",
                "iso_name" => "CANADA",
                    "name" => "Canada",
                 "numcode" => 124
            }
        }
    ]
}

请注意,每个对象的键是键的复数形式。

但是,当我们将端点设置为这样工作时

def inded
  render json: {countries: Country.all}
end

输出如下:

{
    "countries" => [
        [0] {
            "country" => {
                      "id" => 1,
                     "iso" => "US",
                    "iso3" => "USA",
                "iso_name" => "UNITED STATES",
                    "name" => "United States of Foo",
                 "numcode" => 840
            }
        },
        [1] {
            "country" => {
                      "id" => 2,
                     "iso" => "CA",
                    "iso3" => "CAN",
                "iso_name" => "CANADA",
                    "name" => "Canada",
                 "numcode" => 124
            }
        }
    ]
}

即,正确。

然而,设置像{countries: Country.all}这样的键是不好的形式,我想了解为什么rails使用集合键而不是对象键序列化每个元素(也就是说,为什么它是复数而不是单数对于每个country)。

我们没有覆盖to_json或任何其他序列化方法。我们使用默认的rails模型序列化器(我尝试制作一个显式的序列化器,但行为没有变化)。对于我的生活,我不能弄清楚为什么它会使这些键复数化。

编辑:还有更多奇怪之处。关于显式序列化程序我是不正确的,当我设置一个序列化程序(只有正常显示的属性)时,我明白了:

{
    "countries" => [
        [0] {
                  "id" => 1,
                 "iso" => "US",
                "iso3" => "USA",
            "iso_name" => "UNITED STATES",
                "name" => "United States of Foo",
             "numcode" => 840
        },
        [1] {
            "countries" => {
                      "id" => 2,
                     "iso" => "CA",
                    "iso3" => "CAN",
                "iso_name" => "CANADA",
                    "name" => "Canada",
                 "numcode" => 124
            }
        }
    ]
}

第一个对象没有密钥,而每隔一个对象都是复数。我在测试中进行了测试,并通过进行实际的API调用进行了确认。

除了被覆盖的<=>to_s之外,我找不到任何覆盖此内容的内容。这些不应该以这种方式影响输出吗?

2 个答案:

答案 0 :(得分:0)

迈克,我认为你复制并粘贴了一些错误,或者你可能只是感到困惑。

两个产出都有相同的结果:国家(Plural)作为主要响应,国家(Singular)表示国家内部的每个人。还是我误读了?

答案 1 :(得分:0)

我认为这里发生的事情是你试图以AM :: S不支持的方式指定根密钥。

而不是render json: { countries: Country.all },我建议尝试render json: Country.all, root: "countries"(如果你在CountriesController中调用序列化程序,则指定根密钥是不必要的,否则你需要它来获得你想要的功能)

有关详细信息,请参阅https://github.com/rails-api/active_model_serializers/tree/0-8-stable#arrays