2016-03-01 29 views
0

我有一个叫做“Membership”的模型,它有一个字符串属性“inviteToken”,我想用它作为我的主键。如何用JSON API属性覆盖主键

我创建了以下序列化程序,但无法从JSON中获取主键。

应用程序/串行器/ membership.js:

import DS from 'ember-data'; 

export default DS.JSONAPISerializer.extend({ 
    primaryKey: 'invite-token' // also tried 'inviteToken' 
}); 

我得到特定的错误是:

Error while processing route: invitations.show Assertion Failed: You must include an 'id' for membership in an object passed to 'push'
Error: Assertion Failed: You must include an 'id' for membership in an object passed to 'push'

,当我试图通过其ID的路线到达创纪录恰好:

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model(params) { 
    return this.store.find('membership', params.token); 
    } 
}); 

API响应:

{ 
    "jsonapi":{ 
    "version":"1.0" 
    }, 
    "data":{ 
    "type":"membership", 
    "id":"30", 
    "attributes":{ 
     "invite-token":"5bGo7IhZh93E4SB07VWauw" 
    } 
    } 
} 

奇怪的是,如果我使用“type”作为主键,我会在ember inspector中看到“membership”作为id。就好像烬数据不知道如何使用“属性”中的某些东西。我使用的是烬数据2.4.0。

更新

我可以破解这个在我的串行做这个工作:

import DS from 'ember-data'; 

export default DS.JSONAPISerializer.extend({ 
    normalize: function(type, hash) { 
    const json = this._super(type, hash); 
    json.data.id = json.data.attributes.inviteToken; 

    return json; 
    } 
}); 
+0

你什么时候得到这些错误?与'store'有关的具体代码是什么原因造成的? –

+0

@DanielKmak我添加了路由代码和一个序列化器,它可以完成我需要的工作。 –

回答

3

的串行预计primaryKey值是指一个顶层元素在JSON。这就是“type”和“id”起作用的原因。目前,它不支持嵌套属性(例如PrimaryKey的:“attributes.invite令牌”)

然而有两个良好的解决方法:

首先是重写extractId方法。 default implementation很简单。你的情况,你可以这样做:

extractId(modelClass, resourceHash) { 
    var id = resourceHash['attributes']['invite-key'; 
    return coerceId(id); 
    }, 

第二种方式是你发现的方法,更强力的办法,那就是在标准化功能手动分配的ID。