我们有一个简单的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
之外,我找不到任何覆盖此内容的内容。这些不应该以这种方式影响输出吗?
答案 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。