У нас есть бэкэнд-сервер Ruby on Rails и интерфейс EmberJS.
Мы создаем новый объект в Ember, который является частью древовидной структуры (имеет родителя, детей и т. Д.). Мы хотели бы вернуть все объекты в древовидной структуре как часть ответа от внутреннего сервера; например. когда мы создадим новый объект, мы вернем себя + предков. Вот где возникает проблема. Ответ от сервера возвращает идентификатор для нового объекта и , на который ссылаются те же идентификаторы в данных self + ancestors. Это приводит к тому, что данные Ember / Ember отклоняют данные, поскольку на идентификатор уже ссылаются в хранилище данных; например:
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"
}
]
}
}
}
}
Идентификатор возвращаемого объекта - 0bf1f751-6e00-4652-96fa-840d5390f01d
, и тот же идентификатор присутствует в разделе self-and-descendants
и self-and-ancestors
ответа.
Пример того, как мы храним / сохраняем данные, выглядит следующим образом:
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) {
}
},
}
});