2016-06-22 7 views
1

I umfassen derzeit eine Datenbank mit 2 Objekte haben:Ember JS: Adapter Customizing mehrere Parameter

  1. Rolle
  2. Permission

ONE Rolle können viele Berechtigungen. Im Moment habe ich meine Rolle Adapter Setup als:

export default DS.RESTAdapter.extend(DataAdapterMixin, { 
    namespace: 'v1', 
    host: ENV.APP.API_HOST, 
    authorizer: 'authorizer:application', 
    pathForType: function(type) { 
    return 'staff/roles'; 
    } 
}); 

standardmäßig, wenn eine Erlaubnis zu einer Rolle hinzugefügt wird, diese Anforderung erzeugt:

Anfrage:

PUT /v1/staff/roles/1 

Körper:

{ 
    "name": "name_of_role" 
    "permissions": [ 
    { 
     "id": "3", 
     "name": "name_of_permission" 
    }, 
    ... 
    ] 
} 

Ich möchte meinen Adapter anpassen, um eine Anfrage zu erstellen, die stattdessen so aussieht:

Anfrage:

PUT /v1/staff/roles/1/permissions/3 

Körper:

<None> 

Kann mir bitte jemand sagen, wie ich über das tun dies gehen kann? Die Aktualisierung der Server-API zur Aufnahme von Ember JS ist leider nicht möglich.

UPDATE:

Basierend auf Ryans Antwort, hier ist ein (ich es chaotisch nennen würde) Abhilfe, die den Trick für mich getan hat.

offen für Vorschläge für die Herstellung dieser elegantere:

export default DS.RESTAdapter.extend(DataAdapterMixin, { 
    namespace: 'v1', 
    host: ENV.APP.API_HOST, 
    authorizer: 'authorizer:application', 
    pathForType: function(type) { 
    return 'staff/roles'; 
    }, 

    updateRecord: function(embestore, type, snapshot) { 
    var roleID = snapshot.id; 
    var permissionID = snapshot.adapterOptions.permissionID; 
    var url = ENV.APP.API_HOST + "/v1/staff/roles/" + roleID + "/permissions/" + permissionID; 

    return new Ember.RSVP.Promise(function(resolve, reject){ 
     Ember.$.ajax({ 
     type: 'PUT', 
     url: url, 
     headers: {'Authorization': 'OAUTH_TOKEN'}, 
     dataType: 'json', 
     }).then(function(data) { 
     Ember.run(null, resolve, data); 
     }, function(jqXHR) { 
     jqXHR.then = null; // tame jQuery's ill mannered promises 
     Ember.run(null, reject, jqXHR); 
     }); 
    }); 
    }, 
}); 

Antwort

1

Ich kann es in der Dokumentation Ember nicht finden, aber es ist ein universal ajax method zu Adapter angeschlossen, die Sie überschreiben können.

export default DS.RESTAdapter.extend({ 
    host: ENV.host, 
    ajax: function(url, method, hash){ 
     if(hash){ 
      if(hash.data !== undefined && hash.data !== null){ 
       hash.data.sessionId = this.getSessionId(); 
      } 
     }else { 
      hash = { 
       data: {} 
      }; 
      hash.data.sessionId = this.getSessionId(); 
     } 
     return this._super(url, method, hash); 
    }, 
    getSessionId: function(){ 
     return window.sessionStorage.getItem('sessionId') || {}; 
    } 
} 

Dies legt die sessionId jeden Ajax-Aufruf an der allerdings aus der gesamten Anwendung gemacht Server:

Also in meinem Adapter unser Auth Schema paßt Ich habe dies getan.

Ändern Sie es, um Ihre url basierend auf den hash Argumente zu ändern, sollte kein Problem sein.

Meine Version von Ember ist 2.3.2, aber ich bin auf der neuesten stabilen (2.5.2) Version von Ember-Daten und das funktioniert immer noch großartig, falls Sie sich Sorgen über das Alter dieses Blog-Posts machen .

+0

Danke für die tollen Zeiger @ryan. Fügt meiner Antwort ein Update mit der verwendeten Lösung hinzu. Folge deiner Richtung ziemlich genau. – unicornherder