2013-03-12 20 views
8

Ich habe gesehen, diese Frage gesprochen, aber ich habe immer noch Probleme mit Manhandling Mongo _id in id. Ich benutze Mungo als mein ORM und während es virtuals hat, kann ich nicht scheinen, dass es richtig funktioniert. Unten ist, was ich in meinem Mungo-Modell habe.Ember, Ember Data und MongoDBs _id

Versuch Vom Backend zu beheben

mongoose = require 'mongoose' 
Schema = mongoose.Schema 
ObjectId = Schema.ObjectId 

ApartmentSchema = new Schema 
    body: String 
    date: { type: Date, default: Date.now } 
    deleted: {type: Boolean, default: false} 
    saved: {type: Boolean, default: false} 
    visited: {type: Boolean, default: false} 
    email: String 
    phoneNumber: String 
    href: String 

ApartmentSchema.virtual('id').get -> return @_id 

module.exports = mongoose.model 'Apartment', ApartmentSchema 

Wenn ich eine neue Instanz dieses Modells in Express erstelle ich die ID wieder ein nachschauen wie apt.id und bekommen tun können, aber wenn ich die Antwort nach unten schicken an den Kunden, ich habe nur _id und nicht id.

Die zweite Lösung, die ich ausprobiert habe, war, eine berechnete Eigenschaft für id zu erstellen, aber aus irgendeinem Grund mag ember das nicht. Es gibt 2 Probleme hier. Ember respektiert eine berechnete Eigenschaft namens id nicht oder zumindest nicht mehr. So sieht mein Glutendatenmodell aus.

Versuch, ihn vom Frontend zu beheben

App.Apartment = DS.Model.extend({ 
    body: DS.attr('string'), 
    date: DS.attr('date'), 
    deleted: DS.attr('boolean'), 
    saved: DS.attr('boolean'), 
    visited: DS.attr('boolean'), 
    email: DS.attr('string'), 
    phone: DS.attr('string'), 
    _id: DS.attr('string'), 
    id : function() { 
    return this.get('_id') 
    }.property('_id') 
}); 

In meiner Vorlage unten, macht nichts für die ID.

{{#each apartment in controller}} 
    <li>{{apartment.body}} | {{apartment.date}} | {{apartment.href}} {{apartment.id}}</a> {{#linkTo 'apartment' apartment }} View {{/linkTo}} </li> 
{{/each}} 

Die linkTo Helfer arbeiten, aber die URL hat null, wo die ID sein sollte. Dies führt dazu, dass der Zurück-Knopf aufgebrochen wird und die Daten mehrfach geladen werden. Unten ist mein Router für irgendeinen Kontext.

App.Router.map(function(){ 
    this.resource('apartments', function(){ 
    this.resource('apartment', { path: ':apartment_id' }); 
    }); 
}); 

Ändern des Namens meines berechnet id Eigenschaft auf so etwas wie foo und dann mein Router path: ':apartment_foo' Ergebnisse in Urls zu ändern, die die Objektreferenz in der URL zB haben: #/apartments/<App.Apartment:ember357:null>.

Es ist Zeug wie das, das mich über Glut erregt. Jede Hilfe wäre willkommen.

Antwort

9

Ab Ember 1.0.0-rc 1 und Ember Data Revision 11 scheint dies die beste Lösung zu sein.

App.Adapter = DS.RESTAdapter.extend({ 
    serializer: DS.RESTSerializer.extend({ 
    primaryKey: function(type){ 
     return '_id'; 
    } 
    }) 
}); 

App.Store = DS.Store.extend({ 
    revision: 11, 
    adapter: 'App.Adapter' 
}); 
+0

Für mich ändert dies den 'Null'-Teil der Route zu' [object Object] ', da die BSON Objekt ID als Objekt serialisiert wird (zB' "_id": {"$ oid": "5147130ffddd310aeb000001"} ') . Gab es eine Lösung in Ihrer ursprünglichen Frage, die daraus eine Zeichenfolge macht? –

7

Ab Ember Daten - Version: v1.0.0-beta.2 konnte ich folgendes tun:

App.ApplicationSerializer = DS.RESTSerializer.extend({ 
    primaryKey: "_id" 
}); 

Ich bin ziemlich neu in Ember, so könnte dies nicht sein die beste Methode, aber es hat funktioniert!

+0

Nach der Suche nach Stunden, dies ist das einzige, das für mich arbeitete, danke – iConnor

+0

Ember Daten hat die Anzahl der zugänglichen Methoden in letzter Zeit reduziert Dies scheint nicht dokumentiert zu sein, aber das primäre Schlüsselattribut ist Zugriff über [diese private Methode] (https://github.com/emberjs/data/blob/v1.0.0-beta.3/packages/ember-data/lib/serializers/rest_serializer.js#L162). –

5

hatte ich das gleiche Problem wie Chris mit einem ID suchen etwas wie folgt aus:

"_id":{"$oid":"52772aa44f6c6c5dd0000000"} 

die $ oid Teil claptimes' Lösung für mich gearbeitet hinzufügen.

+0

Fast funktioniert für mich, aber es scheint, dass die ID immer noch nicht zurückkehrt (obwohl alle anderen Daten zurückkommen). –

+0

Ich habe ein ähnliches Problem zwischen Mongodb und ember-Daten, wenn jemand einen Blick darauf werfen möchte: http://StackOverflow.com/questions/20544371/ember-Data-1-0-0-activemodeladapter-error-include-an -id-in-a-hash-passed-to-p – brg

2

Seit der Migration auf Ember-CLI hat sich dieser Prozess leicht geändert.Sie wollen nun, dies zu tun:

  1. Von der Ember-CLI-Projekt Befehlszeile:

    ember g serializer application 
    
  2. Machen Sie Ihre neu erstellte Serializer wie folgt aussehen:

    import DS from 'ember-data'; 
    
    export default DS.RESTSerializer.extend({ 
        primaryKey: '_id' 
    }); 
    
0

Ab Ember 2.0.0 ist die korrekte Art, Mongo-IDs zu normalisieren, die Verwendung des extractId im Serializer. Hier ist ein Beispiel für RESTSerializer läuft gegen eine Rails/Grape API:

import DS from 'ember-data'; 

export default DS.RESTSerializer.extend({ 
    isNewSerializerAPI: true, 
    extractId: function (modelClass, resourceHash) { 
    return resourceHash.id.$oid; 
    } 
}); 

Beachten Sie, dass Sie haben isNewSerializerAPI zu true dafür an die Arbeit.

Für Ihren Bedarf könnten Sie versuchen, zu resourceHash._id.$id oder was auch immer für Sie funktioniert ändern. Wenn Sie sich nicht sicher sind, versuchen Sie console.log(resourceHash), um die Daten zu überprüfen.

+0

Die Verwendung von 'resourceHash._id. $ oid' funktioniert für mich. –