2015-08-19 2 views
0

Я пытаюсь установить встроенные записи в свой проект, используя Ember-cli. Я не могу заставить его работать, я пробовал разные конфигурации с помощью {embedded: "always" и т. Д.}, Но все, что я получаю, это: Ошибка: утверждение не выполнено: вы должны указать id для пользователя в объекте, переданном push Пожалуйста, помогите.Как вставить модель в модель (записи в гнезде) с использованием данных ember?

Я использую

DEBUG: ------------------------------- 
DEBUG: Ember    : 1.12.1 
DEBUG: Ember Data  : 1.13.4 
DEBUG: jQuery   : 2.1.4 
DEBUG: Ember Simple Auth : 0.8.0 
DEBUG: ------------------------------- 

My JSON с QuestionDefinition s является:

{ 
    "data": [ 
     { 
      "created": 1439824135440, 
      "updated": 1439824135440, 
      "userID": 20, 
      "user": { 
       "password": null, 
       "created": null, 
       "updated": null, 
       "photoID": null, 
       "photo": null, 
       "email": "[email protected]", 
       "emailConfirmed": false, 
       "phoneNumber": null, 
       "phoneNumberConfirmed": false, 
       "accessFailedCount": 0, 
       "id": 20, 
       "userName": "qwerty" 
      }, 
      "addCategoriesIDs": [], 
      "removeCategoriesIDs": [], 
      "recommendations": [], 
      "removeRecommendstionIDs": [], 
      "patternAnswers": [], 
      "removePatternAnswerIDs": [], 
      "hint": null, 
      "version": 1, 
      "commonVersion": 2, 
      "id": 1, 
      "questionText": "Test?", 
      "weight": 0, 
      "answerType": 0, 
      "status": 0, 
      "estimatedTime": null, 
      "private": false 
     }, 
     { 
      "created": 1439824143340, 
      "updated": 1439824143340, 
      "userID": 20, 
      "user": { 
       "password": null, 
       "created": null, 
       "updated": null, 
       "photoID": null, 
       "photo": null, 
       "email": "[email protected]", 
       "emailConfirmed": false, 
       "phoneNumber": null, 
       "phoneNumberConfirmed": false, 
       "accessFailedCount": 0, 
       "id": 20, 
       "userName": "qwerty" 
      }, 
      "addCategoriesIDs": [], 
      "removeCategoriesIDs": [], 
      "recommendations": [], 
      "removeRecommendstionIDs": [], 
      "patternAnswers": [], 
      "removePatternAnswerIDs": [], 
      "hint": null, 
      "version": 1, 
      "commonVersion": 3, 
      "id": 2, 
      "questionText": "Test?", 
      "weight": 0, 
      "answerType": 0, 
      "status": 0, 
      "estimatedTime": null, 
      "private": false 
     } 
    ] 
} 

QuestionDefinition модель:

//app/models/questiondefinition.js 
import Ember from 'ember'; 
import DS from "ember-data"; 

export default DS.Model.extend({ 
    //id   : DS.attr('string'), //sie nie uzywa 
    created    : DS.attr('pl-date'), 
    updated    : DS.attr('pl-date'), 
    userID    : DS.attr('number'), 
    user     : DS.belongsTo('user',{async: false, embedded: 'always'}), 
    //hint   : DS.attr('string'), 
    hint     : null, 
    version    : DS.attr('number'), 
    commonVersion  : DS.attr('number'), 
    questionText   : DS.attr('string'), 
    weight    : DS.attr('number'), 
    answerType   : 0, 
    status    : 0, 
    estimatedTime  : DS.attr('number'), 
    "private"   : DS.attr('boolean'), 
    questionDefLegalBasis: function() { 
     return this.get('questionText').length % 2 > 0; 
    }.property('questionText'), 

    /** 
    * One-to-many 
    */ 
    patternAnswers : DS.hasMany('patternanswer'), 
    recommendations: DS.hasMany('recommendation'), 
    categories  : DS.hasMany('questiondefinitioncategory', {async: true}), 
    comments  : DS.hasMany('questiondefinitioncomment', {async: true}) 
}); 

модель Пользователь:

//app/models/user.js 
import Ember from 'ember'; 
import DS from "ember-data"; 

export default DS.Model.extend({ 
    "password": DS.attr('string'), 
    "created": DS.attr('pl-date'), 
    "updated": DS.attr('pl-date'), 
    "photoID": DS.attr('number'), 
    "photo": DS.attr('string'), 
    "email": DS.attr('string'), 
    "emailConfirmed": DS.attr('boolean'), 
    "phoneNumber": DS.attr('string'), 
    "phoneNumberConfirmed": DS.attr('boolean'), 
    "accessFailedCount": DS.attr('number'), 
    "userName": DS.attr('string'), 
    /** 
    * One-to-many 
    */ 
    //questionDefinitions : DS.hasMany('questiondefinition'), 
    questionDefinitionComments : DS.hasMany('questiondefinitioncomment'), 
    patternAnswers : DS.hasMany('patternanswer'), 
}); 

И последнее, но не в последнюю очередь, сериализатору:

//app/serializers/questiondefinition.js:4 
import DS from "ember-data"; 

function removeErrorsIfEmtpy(payload) { 
    if (typeof payload.errors !== 'undefined' && payload.errors.length === 0) { 
     delete payload.errors; 
    } 
} 

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, { 
    attrs  : { 
     user: {embedded: 'always', 
      serialize : 'record', 
      deserialize: 'record' 
     } 
     //comments: { serialize: 'ids' } 
    }, 
    extractArray : function (store, type, payload) { 
     payload.questiondefinitions = payload.data; 
     delete payload.data; 
     removeErrorsIfEmtpy(payload); 
     //console.log(arguments); 
     //return this._super(store, type, payload); 
     return this._super.apply(this, arguments); 
    }, 
    extractSingle: function (store, primaryTypeClass, payload, recordId) { 
     payload.questiondefinition = payload.data; 
     delete payload.data; 
     removeErrorsIfEmtpy(payload); 
     //return this._super(store, primaryTypeClass, payload, recordId); 
     return this._super.apply(this, arguments); 
    } 
}); 

ответ

0

Этот загадочный вопрос может быть без ответа на следующий 20 м стеком, но вот ответ. Глядя на questiondefinition serializer, вы видите, что есть подделка с полезной нагрузкой, потому что ответы сервера с объектами хранятся в свойстве data. Загадочная ошибка Ошибка: утверждение не выполнено: вы должны указать идентификатор пользователя в объекте, переданном для нажатия, и привели меня к источнику данных ember-данных, где я узнал, что я не подготовил сериализатор для пользовательской модели. Так что ember просто хотел пользовательских свойств, но все, что он мог получить, это свойство data. Поэтому помните, что всегда обновляйте сериализаторы.

Это IT!