2013-03-12 16 views
8

Widziałem to pytanie, ale wciąż mam problemy z obsługą Mango Mongo _id w id. Używam mangusty jako mojej ORM i chociaż ma wirtualne, nie mogę sprawić, żeby działała poprawnie. Poniżej znajduje się to, co mam w moim modelu mongoose.Ember, Ember Data i MongoDB _id

próbować naprawić Od backend

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 

Kiedy utworzyć nową instancję tego modelu w ekspresowym mogę zrobić patrzeć jak apt.id i uzyskać identyfikator z powrotem, ale kiedy wysłać odpowiedź w dół do klienta, po prostu mam _id, a nie id.

Drugim rozwiązaniem, które próbowałem, było stworzenie obliczonej właściwości dla id, ale z jakiegokolwiek powodu ember tego nie lubi. Tutaj są 2 problemy. Ember nie respektuje obliczonej właściwości o nazwie id lub przynajmniej już nie. Tak wygląda mój model danych ember.

próbować naprawić go z Frontend

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') 
}); 

w swoim szablonie poniżej, nic nie świadczy o id.

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

W linkTo pomocnicy pracują ale url ma wartość null, gdzie id powinno być. Powoduje to przerwanie backbutton i wielokrotne ładowanie danych. Poniżej znajduje się mój router dla pewnego kontekstu.

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

Zmiana nazwy mojego obliczonego id własności do czegoś podobnego foo a następnie zmieniając mój router do path: ':apartment_foo' wyników w adresach URL, które mają odniesienie do obiektu w adresie URL, np #/apartments/<App.Apartment:ember357:null>.

To takie rzeczy, które mnie denerwują. Każda pomoc będzie doceniona.

Odpowiedz

9

Od wersji Ember 1.0.0-rc 1 i Ember Data 11 wydaje się, że jest to najlepszy sposób na rozwiązanie tego problemu.

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

Dla mnie zmienia to 'null' część trasy na' [Object Object] ', ponieważ identyfikator obiektu BSON jest serializowany jako obiekt (np.' "_id": {"$ oid": "5147130ffddd310aeb000001"} ') . Czy w pierwotnym pytaniu pojawiła się poprawka, która zamienia ją w ciąg znaków? –

7

Jak Cienia Data - Wersja: v1.0.0-beta.2, byłem w stanie wykonać następujące czynności:

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

Jestem całkiem nowy, Ember, więc to może nie być najlepsza metoda, ale zadziałało!

+0

Po wyszukaniu godzin, jest to jedyna, która zadziałała dla mnie, dzięki – iConnor

+0

Dane Ember zmniejszyły liczbę dostępnych metod Ostatnio to nie wydaje się być udokumentowane, ale atrybutem klucza głównego jest dostęp przez [ta metoda prywatna] (https://github.com/emberjs/data/blob/v1.0.0-beta.3/packages/ember-data/lib/serializers/rest_serializer.js#L162). –

5

miałem ten sam problem jak Chris z identyfikatorem szuka coś takiego:

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

Dodanie $ oid części do rozwiązania claptimes' pracował dla mnie.

+0

Prawie działa dla mnie, ale wygląda na to, że id wciąż nie wraca (mimo że wszystkie inne dane wracają). –

+0

Mam podobny problem między Mongodb i dane ember, na które ktoś chce spojrzeć: http://stackoverflow.com/questions/20544371/ember-data-1-0-0-activemodeladapter-error-include-an -id-in-a-hash-passed-to-p – brg

2

Od czasu migracji do Ember-CLI ten proces nieco się zmienił.Teraz chcemy to zrobić:

  1. Z linii poleceń projekt Ember-CLI:

    ember g serializer application 
    
  2. Nakręć nowo utworzony serializer wyglądać następująco:

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

Od wersji Ember 2.0.0 właściwym sposobem normalizacji identyfikatorów Mongo jest użycie serializera extractId. Oto przykład dla RESTSerializer działa przeciwko Rails/Grape API:

import DS from 'ember-data'; 

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

Należy pamiętać, że trzeba ustawić isNewSerializerAPI do true to zadziałało.

Dla twojej potrzeby możesz spróbować zmienić na resourceHash._id.$id lub cokolwiek innego działa dla ciebie. Jeśli nie masz pewności, spróbuj console.log(resourceHash), aby sprawdzić dane.

+0

Użycie 'resourceHash._id. $ oid' działa dla mnie. –

Powiązane problemy