JSON API响应和ember模型名称

时间:2015-09-28 21:23:40

标签: ember.js ember-data json-api

关于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响应键"键入"两者都是单数?或者只要匹配就没关系?

2 个答案:

答案 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所暗示的,它做了一些规范化;在我的情况下,它涵盖了“复数与单数”问题。