2015-02-10 11 views
7

Sto provando a fare qualcosa che sembra semplice ma non riesco a trovare la soluzione.Definire il modello di dati di brace per l'URL di riposo annidato

La mia applicazione deve modificare i documenti che contengono pagine.

Ecco il mio modello:

MyApplication.Document = DS.Model.extend({ 
    title: DS.attr('string'), 
    pages: DS.hasMany('page', {async: true}) 
}); 
MyApplication.Page = DS.Model.extend({ 
    document: DS.belongsTo('document', {async: true}), 
    title: DS.attr('string'), 
    params: DS.attr(), 
    objects: DS.attr() 
}); 

E i percorsi:

MyApplication.Router.map(function() { 
    this.resource('document', {path: '/document/:document_id'}); 
}); 
MyApplication.Document = Ember.Route.extend({ 
    model: function (params) { 
     return this.store.find('document', params.document_id); 
    } 
}); 

Quando carico il documento 1, la chiamata applicazione http://www.myserver.com/api/document/1.

Il problema è che quando voglio trovare una pagina del documento, chiama

  • http://www.myserver.com/api/pages/ID

invece di

  • http://www.myserver.com/api/document/1/pages/ID

Tesi URL nidificato ar e importante nella mia applicazione.

ho trovato cose diverse sul tema come l'aggiunta di links nella risposta JSON:

{ 
    "document": { 
     "id": "1", 
     "title": "Titre du document", 
     "pages": ["1", "2", "3"], 
     "links": {"pages" : "pages"} 
}, 

Ma quando lo chiamo per le pagine, richiede http://www.myserver.com/api/document/1/pages senza l'id.

Cerco anche di specificare il documento quando chiedo per la pagina:

this.store.find("page", 1, {document:1}); 

Non riesci a trovare una documentazione completa su questo argomento, quindi se qualcuno mi può spiegare che cosa c'è che non va, sarò contento.

Grazie.

+0

potete inviare i vostri percorsi? –

+0

Inoltre, hai intrattenuto percorsi nidificati nella tua applicazione mantenendo l'API piatta - IE esponendo 'http: // www.myserver.com/api/documents/1' e' http://www.myserver.com/api/pages/1' anziché un'API nidificata. Hai il controllo dell'API? –

+0

È importante ottenere questa struttura nidificata nell'API perché è necessario conoscere il documento per trovare la pagina. La richiesta API sul documento reale, non su un DB – thomaf

risposta

0

Il tuo problema deriva probabilmente dalle virgolette che circondano gli ID nel tuo JSON. Se modifichi il serializzatore in modo che non ci siano virgolette per gli ID sia attorno all'ID del documento che sugli ID delle pagine, dovresti ottenere il comportamento che ti aspetti. Inoltre, è necessario modificare la formattazione dei link che punti al percorso relativo:

Il JSON risultante dovrebbe essere simile:

{ 
    "document": { 
     "id": 1, 
     "title": "Titre du document", 
     "pages": [1, 2, 3], 
     "links": {"pages" : "/documents/1/pages"} 
} 

Si prega di vedere this answer per una descrizione del motivo per cui l'aderenza alle aspettative di Ember per quanto riguarda per il formato JSON è importante e per una panoramica del formato previsto.

+0

Anche con ID senza virgolette e questa "link" dichiarazione "/ documenti/1/pagine", l'URL richiesto è: http://www.myserver.com/api/ documento/1/pagine. Quando rimuovo questa dichiarazione "link", ottengo l'ID: http://www.myserver.com/api/pages/ID – thomaf

+0

Non riesco a vedere l'ultimo bit del tuo commento ma sto assumendo che intendi prova ancora a recuperare 'http: // www.myserver.com/api/document/1/pages' e non' http: // www.myserver.com/api/document/1/pages/1' –

+0

Sì. Ember Data non è probabilmente per me;) – thomaf

3

Depends: EMBER DATA> = V1.0.0-BETA.9

Il modo di gestire le rotte annidati è nascosto sotto release notes

  1. necessità di inviare di nuovo i legami con la risposta come questo

    { 
        "document": { 
        "id": 1, 
        "title": "Titre du document", 
        "links": {"pages" : "/documents/1/pages"} 
    } 
    
  2. Avrai bisogno di personalizzare l'adapter:page ' s metodo buldUrl come

    MyApplication.PageAdapter = DS.RestAdapter.extend({ 
        // NOTE: this is just a simple example, but you might actually need more customization when necessary 
        buildURL: function(type, id, snapshot) { 
        return '/documents/' + snapshot.record.get('document.id') + '/pages/' + id; 
        } 
    }); 
    
2

@code-jaff answer adattato a Ember 2.1.0:

// app/adapters/page.js 
import DS from './application'; // I suppose you have your adapter/application.js 

export default DS.RESTAdapter.extend({ 
    buildURL: function(type, id, snapshot) { 
    return this.host + '/' + this.namespace + '/documents/' + snapshot.record.get('document.id') + '/pages/' + id; 
    } 
});