2015-05-16 2 views
0

Я получаю следующую ошибку, когда я использую Ember Data для создания записей из ответа JSON. Что дает? Я следую за состоянием документов.Данные об Ember Data One One One Creation Fails

Uncaught Error: Assertion Failed: Ember Data expected a number or string to represent the record(s) in the `user` relationship instead it found an object. If this is a polymorphic relationship please specify a `type` key. If this is an embedded relationship please include the `DS.EmbeddedRecordsMixin` and specify the `user` property in your serializer's attrs object. 

JSON разбираемый:

[ 
    { 
     "id": 76, 
     "title": "Title", 
     "shipped": 0, 
     "date": "2015-05-21T05:00:00.000Z", 
     "user": { 
      "firstName": "First Name", 
      "lastName": "Last Name", 
      "email": "[email protected]", 
      "id": 1 
     } 
    } 
] 

Пересылка Модель:

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    title: DS.attr('string'), 
    user: DS.belongsTo('user', { async: false })  
}); 

Маршрут:

import Ember from 'ember'; 

export default Ember.Route.extend({ 

    beforeModel: function() { 

     if(!localStorage.accessToken) { 
      this.transitionTo('login'); 
     } 

    }, 

    model: function() {  
     var shipmentObjects = []; 
     var App = this; 
     Ember.$.getJSON('http://localhost:1337/subscription/1/shipments/upcoming', function(shipments) { 
      shipments.forEach(function(data) { 
      var shipment = App.store.push('shipment', data); 
       shipmentObjects.pushObject(shipment); 
      }); 
     }); 
     return shipmentObjects; 
    } 

}); 

ответ

0

Вы можете создать собственный сериалайзер, если вы не можете изменить ваш ответ JSON и удается организовать данные иным способом

App.MODELNAMESerializer = DS.ActiveModelSerializer.extend({ 
    extract: function(store, type, payload, id, requestType){ 
    var shipments = []; 

    //CREATE A NEW PAYLOAD THAT EMBER CAN READ 

    var _payload = { }; 
    return this._super(store, type, _payload, id, requestType); 
    } 
}); 

Ваш JSON должен выглядеть как этот

{ 
    shipments: [ 
    { 
     "id": 76, 
     "title": "Title", 
     "shipped": 0, 
     "date": "2015-05-21T05:00:00.000Z", 
     "user_id": 1, 
     } 
    ], 
     "users": [ 
     { 
     "firstName": "First Name", 
     "lastName": "Last Name", 
     "email": "[email protected]", 
     "id": 1 
     } 
    ] 
} 
+0

Я могу изменить мой JSON, но зачем мне его менять на ваш пример? Пользовательский объект принадлежит к отгрузке, и есть много партий. – morcutt

+0

Если вы отделите свой json массивом отправки с несколькими объектами, связанными только с идентификатором пользователя, и под массивом пользователей со всей информацией о пользователе ... Ember будет обрабатывать это как связанные модели и создавать каждую отдельную запись и записи пользователя с помощью ember данные. Ember ожидает идентификатор отношения между вашими моделями – abFx

+0

Я согласен с этим. Хотя я не форматировал JSON так же, учитывая, что отношение Ember к ID в JSON действительно работает. Спасибо. – morcutt

0

Прочитать сообщение об ошибке. Это едва ли могло быть яснее. По умолчанию Ember Data ожидает, что ассоциация будет представлена ​​идентификатором. Если ассоциация внедрена, вы должны сообщить Ember Data. Вам нужно что-то вроде:

// serializers/shipment.js 
export default ApplicationSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs: { 
     user: { embedded: 'always' } 
    } 
}); 

И удалить {async: false}, так как данные встраивается прямо там.

См. http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html.

+0

То же ошибка все еще возвращается. – morcutt

+0

Как проверка работоспособности, попробуйте добавить вышеприведенный к сериализатору приложения. Кроме того, я предполагаю, что массив JSON, который вы показываете, фактически находится внутри объекта формы '{shipment: []}', правильно? –

+0

Не повезло. Это должно быть что-то очень прямое. – morcutt