我目前有一个包含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);
});
});
},
});
答案 0 :(得分:1)
我在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调用。
根据传入的url
参数更改它以修改hash
应该不是问题。
我的ember版本是2.3.2,但是我使用的是最新的稳定版(2.5.2版)的ember-data,如果你担心我找到的那篇博文的年代,这仍然很有效。