6

关于与 Ember 模型名称匹配的 JSON API 响应键“类型”的快速问题。

如果我有一个模型,比如“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 规范中有一条注释,上面写着“该规范与变形规则无关,因此类型的值可以是复数或单数。但是,应该在整个实现中一致地使用相同的值。”

所以,

tl;dr 做事的“Ember 方式”是否让模型名称和 JSON API 响应密钥“类型”都是单数?还是只要它们匹配就没有关系?

4

2 回答 2

7

JSON API 序列化程序需要复数类型。来自指南的有效负载示例。

由于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 序列化程序需要复数

讨论

“...ED 在内部使用 camelCased 属性和单数类型,无论您使用什么适配器/序列化器。

当您使用 JSON API 适配器/序列化器时,我们希望用户能够使用 jsonapi.org 上提供的示例并让它正常工作。大多数用户不必关心内部格式,因为序列化程序会为他们处理工作。

这记录在指南中,http://guides.emberjs.com/v2.0.0/models/pushing-records-into-the-store/ ..."

于 2015-09-28T21:40:21.690 回答
2

根据您的用例,您可以尝试pushPayload代替push. 正如文档所暗示的,它进行了一些规范化;就我而言,它涵盖了“复数与单数”问题。

于 2016-11-20T22:33:14.427 回答