【发布时间】:2014-08-18 09:43:04
【问题描述】:
我想知道在 Ember 中使用 createRecord() 创建新记录然后将其持久化到 API 的最佳实践?具体来说,Ember 的 POST 请求一般应该是嵌入所有模型关系的单个 JSON,还是习惯上单独 POST 每个关系?
在我的代码中,我无法获得单个 JSON,所以我想知道我是否缺少“Ember Way”或者(更有可能)我的代码有错误?
详情:
这是我的设置的详细信息。我有两个模型:
/models/OrgUser.js:
DS.Model.extend({
...
orgPerson: DS.belongsTo('org-person', { inverse: 'org-user', async: true, embedded: 'always' }),
});
/models/OrgPerson.js:
DS.Model.extend({
...
orgUser: DS.belongsTo('org-user'),
})
我正在尝试在“创建新用户”页面上创建新用户。该页面的路线如下。这是为我的新模型致电createRecord() 的最佳地点吗?
/routes/org-users/add.js:
Ember.Route.extend({
model: function() {
var orgPerson = this.store.createRecord('org-person');
var orgUser = this.store.createRecord('org-user' );
orgUser.set('orgPerson', orgPerson);
return orgUser;
},
...
}
在我调用 set 后使用 Chrome 控制台查看 orgUser 对象根本没有证据表明我已向 orgUser 添加任何内容。不过,Chrome 调试工具的“Ember”标签确实反映了这种关系。
在我的“创建新用户”页面上,我的输入字段都对应于OrgUser 属性和OrgUser.OrgPerson 属性。这是一个例子:
/templates/org-users/add.hbs
...
{{input value=username}} // a property of OrgUser
{{input value=orgPerson.firstName}} // a property of OrgUser.orgPerson
...
在我的路线中,当我转到 save() Ember Data POSTs 时,只有 null 值为 orgPerson. 的 orgUser JSON 我希望它在 @ 中嵌入 orgPerson 序列化对象987654338@财产。
/routes/org-users/add.js:
Ember.Route.extend({
...
actions: {
submitForm: function() {
...
this.currentModel.save().then( onSuccess ).catch( onFailure );
...
}
}
});
这会产生带有以下正文的POST 请求:
{
"orgUser":{
"username":"MyUsername",
"orgPerson":null,
"id":null
}
请注意,orgPerson 为空。提前感谢您的帮助!
更新:我想我需要重新审视一下我的序列化程序。这是它当前的定义方式。
/serializers/application.js:
DS.RESTSerializer.extend({
// Use the default approach to serializing, but add the id property
serialize: function(record, options) {
var json = this._super.apply(this, arguments);
json.id = record.id;
return json;
},
serializeBelongsTo: function(record, json, relationship) {
var key = relationship.key;
key = this.keyForRelationship ? this.keyForRelationship(key, 'belongsTo') : key;
var data = record.get('data');
if (relationship.options.embedded && relationship.options.embedded === 'always') {
json[key] = data[relationship.key] ? data[relationship.key].serialize( { includeId: true } ) : null;
}
else {
json[key] = data[relationship.key] ? data[relationship.key].get('id') : null;
}
if (relationship.options.polymorphic) {
this.serializePolymorphicType(record, json, relationship);
}
}
});
根据@Kingpin2k 的评论,关于如何最好地处理serialize() 的belongsTo 关系似乎存在一些歧义(和错误!)。我上面的序列化程序自定义非常适合通过this.store.find() 获得的记录,但现在我需要为createRecord() 启用它们。欢迎补充建议,指点!
【问题讨论】:
标签: ember.js ember-data