【问题标题】:JSON API response and ember model namesJSON API 响应和 ember 模型名称
【发布时间】:2015-12-26 05:32:19
【问题描述】:

关于与 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 响应密钥“类型”都是单数?还是只要它们匹配就没有关系?

【问题讨论】:

  • JSON API 序列化程序需要复数类型。你在哪里得到错误?你用store.push吗?
  • 是的,我正在构建测试响应并使用 store.push。再次感谢!

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


【解决方案1】:

根据您的用例,您可以尝试使用pushPayload 而不是push。正如documentation 建议的那样,它做了一些标准化;就我而言,它涵盖了“复数与单数”的问题。

【讨论】:

    【解决方案2】:

    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 需要 singular 类型,JSON API 序列化程序需要 plural

    来自discussion

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

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

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

    【讨论】:

    • 啊!谢谢,我应该更仔细地阅读那篇指南
    猜你喜欢
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    相关资源
    最近更新 更多