我们有一个Ruby on Rails后端服务器和一个EmberJS前端。
我们在Ember中创建一个新对象,该对象是树结构的一部分(具有父级,子级等)。我们希望返回树形结构中的所有对象,作为后端服务器回复的一部分。例如。当我们创建一个新对象时,我们将返回自身+祖先。这就是问题所在。服务器的回复返回新对象的ID,并且在self +祖先数据中引用了相同的ID。这会导致Ember / Ember数据拒绝该数据,因为该ID已在数据存储区中被引用;例如:
Error: Assertion Failed: 'node' was saved to the server, but the response returned the new id '9f06c18e-0507-41d2-a8af-c330fa896bac', which has already been used with another record.
是否可以通过任何方式设置模型,从而实现上述目的?例如。 Ember / Ember数据不会拒绝新对象,因为它已经在回复中被引用了?
编辑:添加示例回复
来自服务器的示例回复可能是这样的:
{
"data":{
"id":"0bf1f751-6e00-4652-96fa-840d5390f01d",
"type":"accounts",
"attributes":{
"name":"Global"
},
"relationships":{
"parent":{
"data":null
},
"children":{
"data":[
{
"id":"77fbf094-610a-42c0-841b-693aefbd5e52",
"type":"accounts"
}
]
},
"self-and-ancestors":{
"data":[
{
"id":"0bf1f751-6e00-4652-96fa-840d5390f01d",
"type":"accounts"
}
]
},
"self-and-descendants":{
"data":[
{
"id":"0bf1f751-6e00-4652-96fa-840d5390f01d",
"type":"accounts"
},
{
"id":"77fbf094-610a-42c0-841b-693aefbd5e52",
"type":"accounts"
}
]
}
}
}
}
返回的对象的ID为0bf1f751-6e00-4652-96fa-840d5390f01d
,并且答复的self-and-descendants
和self-and-ancestors
部分中存在相同的ID。
关于我们如何存储/保存数据的示例如下:
import Component from '@ember/component';
import Changeset from 'ember-changeset';
import { inject as service } from '@ember/service';
const { get, set } = Ember;
export default Component.extend({
store: service(),
formType: '',
didReceiveAttrs() {
this._super(...arguments);
let formType = get(this, 'formType');
switch(formType) {
case 'new':
this.newCar();
break;
}
},
newCar() {
let car = this.get('store').createRecord('car', {});
let changeset = new Changeset(car);
set(this, 'changeset', changeset);
set(this, 'form-action', 'createCar');
},
actions: {
createCar(changeset) {
changeset.save().then(success).catch(failure);
let self = this;
function success() {
}
function failure(e) {
}
},
}
});