2017-09-27 1 views
0

Ich erstelle eine Ember App mit einer Symfony REST API. Ich verwende auch den REST-Adapter für meine Anfragen.Ember.js: Anfrage bearbeiten URL

Ich habe 2 Modelle in meiner App: Benutzer und ihre verwandten Kommentare. Ich habe bereits CRUD-Operationen für meine Benutzereigenschaften erstellt und jetzt konzentriere ich mich auf die CRUD-Operationen für Kommentare.

Model user.js

export default DS.Model.extend({ 
    firstName: DS.attr('string'), 
    lastName: DS.attr('string'), 

    comments: DS.hasMany('comment') 
}); 

Model comment.js

export default DS.Model.extend({ 
    title: DS.attr('string'), 
    message: DS.attr('string'), 

    user: DS.belongsTo('user') 
}); 

Ich habe eine Route, die alle Kommentare zeigt (und andere Daten) eines bestimmten Benutzers. Die Anforderung lädt das Benutzerobjekt und seine Beziehungen. In der Ansicht habe ich auch ein Formular und eine Aktion, um einen neuen Kommentar für diesen Benutzer zu erstellen.

Route users/get.js

import Ember from 'ember'; 

export default Ember.Route.extend({ 

    id: null, 

    model(params) { 
     this.set('id', params.user_id); 
     return this.get('store').findRecord('user', params.user_id, {include: 'comments'}); 
    }, 
}); 

Route users/get/comments.js

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model(params) { 
     return this.modelFor('user.get', params.user_id); 
    }, 
}); 

Controller users/get/comments.js

import Ember from 'ember'; 

export default Ember.Controller.extend({ 

    newComment: null, 
    user: null, 

    init: function() { 
     this._super(...arguments); 

     let comment = this.store.createRecord('comment'); 
     this.set('newComment', comment); 
    }, 

    actions: { 
     saveComment: function() { 
      let user = this.get('model'); 
      let comment = this.get('newComment'); 

      comment.set('user', user); 
      comment.save(); 
     } 
    } 
}); 

Alles funktioniert, außer der Anfrage an das Backend. Ich lud die Kommentare von dem Benutzer, so erwarte ich einen Aufruf an:

POSThttp://my-app.local/comments/

:

POSThttp://my-app.local/users/comments/

Stattdessen wird der Anruf gesendet wird, Weißt du warum und wie könnte ich das korrigieren?

Das zweite Problem, das Modell wird von der Route 'user.get' geladen. Das funktioniert, weil der Benutzer von dieser Route zu dieser Seite kommt, aber ... Es funktioniert nicht, wenn der Benutzer die URL für Kommentare direkt eingibt. Das klingt logisch, aber ich habe keine Ahnung, wie ich dieses Problem beheben kann ... Können Sie mir helfen?

+0

Route Benutzer/get/comments.js warum haben Sie diese Route hier eingefügt.Es sagt nichts. Es wäre besser, das Elternelement anzuzeigen, das die Daten aufruft. – Epirocks

+0

Entschuldigung, ich habe den Post aktualisiert, um die Route hinzuzufügen. – Rubix

Antwort

1

Dies kann durch erneutes Schreiben der CommentAdapter.urlForCreateRecord Methode erfolgen. Welche Auswirkungen haben neue Kommentaraufzeichnungen?

Adapter/comment.js

import DS from 'ember-data'; 

export default DS.RESTAdapter.extend({ 
    urlForCreateRecord(modelName, snapshot) { 
     return '/users/comments'; // the url you want 
    } 
}); 

Es gibt mehrere urlFor... Methode sind Sie benötigen Ihre URL anpassen. Überprüfen Sie einfach das Dokument http://devdocs.io/ember/classes/ds.buildurlmixin/methods#urlForCreateRecord

+0

Vielen Dank für Ihre Lösung, aber ich würde gerne die Logik von Ember darüber verstehen. Generiert Ember nur ** '[POST] http: //domain.ext/entity/'** Anfragen für Kreationen standardmäßig? Es scheint mir logisch, wenn ich ein Objekt erstellen, das zu einem anderen Objekt gehört, sollte ich die Möglichkeit haben, eine ** '[POST] http: //domain.ext/parent_entity/ {id}/Kind_entity '** standardmäßig ...? – Rubix

+0

Soweit ich weiß, beschränkt Ember nicht wirklich, welche Art von API-Protokoll Sie verwenden sollten. Unter API-Protokoll verstehe ich URL-Format und Datenstruktur. Es ist deine Entscheidung zu treffen. Aber Ember stellte JSONApi und einen einfachen Rest-Adapter zur Verfügung. – Kyle

+0

Überprüfen Sie einfach, wie RestAdapter implementiert ist, und versuchen Sie, Ihren eigenen Adapter zu erweitern. Sie sollten in der Lage sein, mit Request-Methode, Request-URL oder Nutzdaten alles zu tun, was Sie wollen. – Kyle