关于JSON API响应键的快速问题"类型"与Ember型号名称匹配。
如果我有模特,请说" models / photo.js"我有一个类似" / photos"的路线,我的JSON API响应看起来像这样
{
data: [{
id: "298486374",
type: "photos",
attributes: {
name: "photo_name_1.png",
description: "A photo!"
}
},{
id: "298434523",
type: "photos",
attributes: {
name: "photo_name_2.png",
description: "Another photo!"
}
}]
}
我假设我的模型名称应该是单数但是会弹出这个错误
Assertion Failed: You tried to push data with a type 'photos' but no model could be found with that name
当然,这是因为我的模型名为"照片"
现在在JSON API规范中有一个注释"此规范与变形规则无关,因此type的值可以是复数或单数。但是,在整个实现过程中应始终使用相同的值。"
所以,
tl; dr是" Ember方式"做同事同时拥有模型名称和JSON API响应键"键入"两者都是单数?或者只要匹配就没关系?
答案 0 :(得分:7)
JSON API序列化程序需要多种类型。 Payload example from guides.
由于modelNameFromPayloadKey
函数单一化,因此它适用于单数类型:
// as is
modelNameFromPayloadKey: function(key) {
return singularize(normalizeModelName(key));
}
但反向操作payloadKeyFromModelName
会使模型名称复数化,如果在后端使用单数类型,则应进行更改:
// as is
payloadKeyFromModelName: function(modelName) {
return pluralize(modelName);
}
内部Ember Data JSON API格式与JSONAPISerializer使用的格式略有不同。 Store.push
需要单数类型,JSON API序列化程序需要复数。
来自discussion:
" ... ED在内部使用camelCased属性和单数类型,无论您使用什么适配器/序列化器。
当您使用JSON API适配器/序列化程序时,我们希望用户能够使用jsonapi.org上提供的示例并使其正常工作。大多数用户从不关心内部格式,因为序列化程序会处理它们的工作。
指南中记录了这一点http://guides.emberjs.com/v2.0.0/models/pushing-records-into-the-store/ ..."
答案 1 :(得分:2)
根据您的使用情况,您可以尝试pushPayload
而不是push
。正如documentation所暗示的,它做了一些规范化;在我的情况下,它涵盖了“复数与单数”问题。