灰烬:必须在传递给“推送”的对象中包含“ id”

时间:2018-07-09 03:08:03

标签: serialization ember.js ember-data

当前遇到以下错误:You must include an 'id' for failed-shotlist in an object passed to 'push'。这是我继承了开发中期的代码库,对Ember来说还很陌生。

据我了解,当后端未使用ID进行响应时,就会发生这种情况。服务器有效负载如下所示(返回带有嵌入式failShotlist记录的警报对象):

alertAuthor: "Test name"
alertDate:"2018-06-28T16:25:21+12:00"
alertIdentifier:"456e15c7-7a8b-11e8-84a8-06f4aef780e3"
alertType:"failedShotlist"
email:"test@gmail.com"
failedShotlist:
    projectIdentifier:"79050dfb-5faf-11e8-84a8-06f4aef780e3"
    projectName:"8888 st"
    projectRoleENUM:"bp"
    projectRoleName:"Building Participant"
    shotlistDescription:"Framing"
    shotlistIdentifier:"79d52773-5faf-11e8-84a8-06f4aef780e3"
inviteIdentifier:null
profileId:"c4e02bee-3d26-11e8-84a8-06f4aef780e3"
shotlistIdentifier:"79d52773-5faf-11e8-84a8-06f4aef780e3"

由于后端不使用ID attr进行响应,因此需要使用序列化程序的“ primaryKey”属性来转换主键:

serializers / alert.js

export default ApplicationSerializer.extend(EmbeddedRecordsMixin, {
  primaryKey: 'alertIdentifier',

  attrs: {
    'invite': { deserialize: 'records' },
    'failedShotlist': { deserialize: 'records' },
  },
});

我找不到任何提及,但我认为嵌入式记录由它们自己的序列化器进一步序列化。现有的一种如下:

serializers / failedShotlist.js

export default ApplicationSerializer.extend({
  attrs: {
    'shotlistId': { key: 'shotlistIdentifier' },
    'projectId': { key: 'projectIdentifier' },
  },
});

由于failShotlist对象的ID也需要转换,因此我对其进行了更新,以包括primaryKey属性:

serializers / failedShotlist.js

export default ApplicationSerializer.extend({
  primaryKey: 'shotlistIdentifier',

  attrs: {
    'shotlistId': { key: 'shotlistIdentifier' },
    'projectId': { key: 'projectIdentifier' },
  },
});

不幸的是,这导致了我最初遇到的相同错误。关于如何解决的任何想法?

1 个答案:

答案 0 :(得分:0)

我忽略的是适配器和序列化器的源文件未遵循其余代码库的命名约定。

在将序列化程序称为failedShotlist.js的地方,将与之相关的模型称为failed-shotlist.js

将序列化程序文件重命名为failed-shotlist.js可以使我现有的代码正常工作:

export default ApplicationSerializer.extend({
  primaryKey: 'shotlistIdentifier'
}