Ember数据一对一关系记录创建失败

时间:2015-05-16 18:57:43

标签: json ember.js ember-data ember-cli

当我使用Ember Data从JSON响应创建记录时,我收到以下错误。是什么赋予了?我正在关注文档所说的内容。

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": "hellothere@gmail.com",
            "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;
   }

});

2 个答案:

答案 0 :(得分:0)

阅读错误消息。这很难说清楚。默认情况下,Ember Data期望关联由ID表示。如果嵌入了关联,则必须告诉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

答案 1 :(得分: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": "hellothere@gmail.com",
        "id": 1
       }
   ]
}