2013-12-12 5 views
6

Ich benutze Ember-Daten und den ActiveModel-Adapter mit Schienen und Mongoid (Mongodb) im Backend. Jedes Mal, wenn ich eine Anfrage an meine Rails-Anwendung zu machen, emberjs zeigt die zurückgegebenen Daten aber in der Konsole Chrom Entwicklers zeigt es:ember-data-1.0.0 activemodeladapter Fehler ein 'ID' in einem Hash zu übergeben 'Push'

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

das Problem reproduziert in einem jsfiddle

ich das Problem in diesen reproduziert jsfiddle. Sie können eine andere Version des gleichen jsfiddle arbeiten, wenn ich ID anstelle von _id verwenden.

Payload vom Backend gesendet

ActiveModel Adapter wandelt die snake_case start_date Kamel-Fall. Ich habe einen benutzerdefinierten Code hinzugefügt, um den Rest-Serializer von ember-data zu konvertieren _id zu id und dieser Code wird weiter unten in dieser Frage eingefügt.

{"schedules":[ 

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

    ]} 

Nun aber die zurück Nutzlast enthält eine id, wenn ich in die Google cgrome Konsole gehen und führen Sie die commmands unten und Zugriff auf die _data, es zeigt die id nicht definiert ist.

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

I f die Offenlegungs Pfeile in der Konsole und graben sich in die _DAT Objekt, das ist, was ich

_data: Object 
    id: undefined 

Benutzerdefinierte Serializer Code

sehe ich die activemodeladapter verlängert die _id-ID von mongodb in id umwandeln und sie als Primärschlüssel festlegen.

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; 
    } 
    */ 
}); 

Die Ember-Datenmodell:

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

Hier ist mein emberjs Router

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

    }); 
}); 

Die emberjs Route defination:

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

emberjs Stack-Trace

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 

Dank

+0

können Sie vollständige Stack-Trace von Fehler und Antwort vom Server an den Browser geben – Hardik127

+0

Der Ember-Fehler ist seltsam, aber aus dem Protokoll Sie haben es sieht aus wie der Fehler auf dem Rails-Server ist (mit Fehler 500 reagieren), könnten Sie bitte gib uns deine 'schedulers_controller.rb'? –

+0

@AdrienCoquio die ganze ** schedules_controller.rb ** ist dort unter dem Abschnitt mit dem Titel ** von Emberjs zu Schienen eingefügt ** – brg

Antwort

0

ich hatte das gleiche Problem. In Ihrem Schienen Serializer für Zeitplan, (vorausgesetzt, Sie eine haben), sollten Sie

attributes :id, :name, :start_date 

tun und einen

has_many :schedule 

in Ihrem SchedulesSerializer haben. Lass mich wissen, ob das funktioniert.

Verwandte Themen