Ember JS:自定义适配器以包含多个参数

Ember JS: Customizing adapter to include multiple parameters

我目前有一个包含 2 个对象的数据库:

  1. 角色
  2. 权限

一个角色可以拥有多个权限。我目前的角色适配器设置为:

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

默认情况下,当权限添加到角色时,它会生成此请求:

要求:

PUT /v1/staff/roles/1

正文:

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

我想自定义我的适配器以生成如下所示的请求:

要求:

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

正文:

<None>

有人可以告诉我该怎么做吗?不幸的是,更新服务器 api 以适应 Ember JS 不是一个选项。

更新:

根据 Ryan 的回复,这里有一个(我称之为凌乱的)解决方法,对我有用。

愿意接受让这更优雅的建议:

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

我在 Ember 文档中找不到它,但有一个 universal ajax method 附加到适配器,您可以覆盖它。

所以在我的适配器中,为了适应我们的身份验证方案,我这样做了:

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

这会将 sessionId 附加到通过整个应用程序对服务器进行的每个 ajax 调用。

根据传入的 hash 参数更改它以修改您的 url 应该不是问题。

我的 ember 版本是 2.3.2,但我使用的是 ember-data 的最新稳定版 (2.5.2),如果您担心的话,它仍然可以正常工作关于那个博客的年龄 post 我找到了。