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
können Sie vollständige Stack-Trace von Fehler und Antwort vom Server an den Browser geben – Hardik127
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'? –
@AdrienCoquio die ganze ** schedules_controller.rb ** ist dort unter dem Abschnitt mit dem Titel ** von Emberjs zu Schienen eingefügt ** – brg