2013-12-12 9 views
6

Sto usando ember-data e l'adattatore activemodel con rail e mongoid (mongodb) nel backend. Ogni volta che faccio una richiesta alla mia applicazione Rails, emberjs visualizza i dati restituiti, ma in console per sviluppatori di Chrome viene visualizzato:errore ember-data-1.0.0 activemodeladapter include un `id` in un hash passato a` push`

Assertion failed: You must include an `id` in a hash passed to `push` 

il problema riprodotto in un jsfiddle

ho riprodotto il problema in questo jsfiddle. È possibile visualizzare una versione diversa di questo jsfiddle funzionante quando utilizzo id anziché _id.

Payload inviato dal backend

adattatore ActiveModel converte lo snake_case start_date di cammello caso. Ho aggiunto del codice personalizzato a ember-data rest-serializer per convertire _id in id e il codice è incollato in basso in questa domanda.

{"schedules":[ 

     { 
     "_id":"529f38596170700787000000", 
     "name":"Hair styling", 
     "start_date":"2013-12-12" 
     } 

    ]} 

Ora se la tornata payload include un id, se vado nella console cgrome google ed eseguire il Commmands qui sotto e accedere al _data, mostra il id non è definito.

a = App.__container__.lookup("controller:schedules") 
b = a.get('content') 

S e utilizzare le frecce di informativa nella console e scavare nell'oggetto _dat, questo è quello che vedo

_data: Object 
    id: undefined 

codice serializzatore personalizzato

ho esteso l'activemodeladapter per convertire _id id di mongodb e impostarlo come chiave primaria.

App.ApplicationSerializer = DS.ActiveModelSerializer.extend({ 
    primaryKey: '_id', 

    normalize: function(type, hash, prop) { 
     this.normalizeMongoidId(hash); 
     return this._super(type, hash, prop); 
    }, 

    normalizeMongoidId: function(hash){ 
    var json = { id: hash._id }; 
    delete hash._id; 

    //hash.id = hash._id; 
    //delete hash._id; 
    } 

    /* 
    serialize: function(record, options){ 
    var json = this._super(record, options); 

     json.schedule._id = json.record.id; 

     delete json.record.id 
     return json; 
    } 
    */ 
}); 

Il modello brace-dati:

App.Schedule = DS.Model.extend({ 
    name: DS.attr('string'), 
    organization: DS.belongsTo('organization') 
}); 

Ecco il mio router emberjs

App.Router.map(function(){ 
    this.resource('schedules', {path: "/schedules"}, function(){ 
    this.resource('schedule', {path: "/:schedule_id"}, function(){}); 

    }); 
}); 

L'emberjs percorso defination:

App.SchedulesRoute = Ember.Route.extend({ 
    model: function(){ 
    return this.store.find('schedule'); 
    } 
}); 

emberjs Analisi dello stack

Assertion failed: You must include an `id` in a hash passed to `push` application.js:31601 
    (anonymous function) application.js:31601 
    Ember.assert application.js:28431 
    DS.Store.Ember.Object.extend.push application.js:69415 
    (anonymous function) application.js:69483 
    Ember.EnumerableUtils.map application.js:30115 
    DS.Store.Ember.Object.extend.pushMany application.js:69482 
    (anonymous function) application.js:69839 
    invokeCallback application.js:36783 
    (anonymous function) application.js:36838 
    EventTarget.trigger application.js:36621 
    (anonymous function) application.js:36921 
    DeferredActionQueues.flush application.js:34001 
    Backburner.end application.js:34092 
    Backburner.run application.js:34131 
    Ember.run application.js:34489 
    hash.success application.js:74468 
    fire application.js:3049 
    self.fireWith application.js:3161 
    done application.js:8236 
    callback 

Grazie

+0

puoi dare traccia dello stack completo di errore e risposta fornita dal server al browser – Hardik127

+0

L'errore ember è strano ma dal log hai sembra che l'errore sia sul server Rails (rispondere con errore 500), potresti per favore dacci il tuo 'schedulers_controller.rb'? –

+0

@AdrienCoquio il completo ** schedules_controller.rb ** è incollato sotto la sezione intitolata ** passando da emberjs a rails ** – brg

risposta

0

ho avuto lo stesso problema. Nella vostra binari serializzatore per il programma, (ammesso che abbiate uno), si dovrebbe fare

attributes :id, :name, :start_date 

e hanno un

has_many :schedule 

nel vostro SchedulesSerializer. Fammi sapere se funziona.

Problemi correlati