我在SO上看到几个问题试图解决将POST请求发送到嵌套API资源路由的问题。
请参阅: - [使用Ember数据(Sending REST requests to a nested API endpoint URL using Ember Data)将REST请求发送到嵌套的API端点URL - Custom request URLs in Ember model
我已经开始在RESTAdapter上重载createRecord,updateRecord和deleteRecord方法,以尝试某种hackery解决方案来构建正确的URL。现在,使用类似于this的方法是我到目前为止所采用的方法。
以下是解决方案中的updateRecord方法:
App.UserAdapter = DS.RESTAdapter.extend({
updateRecord: function(store, type, record) {
if(!record.get('parent') || null === record.get('parent')){
return this._super(store, type, record);
}
var data = {};
var serializer = store.serializerFor(type.typeKey);
var parent_type = record.get('parent');
var parent_id = record.get(parent_type).get('id');
var child_parts = Ember.String.decamelize(type.typeKey).split('_');
var path = Ember.String.pluralize(parent_type) + '/' + parent_id + '/' + Ember.String.pluralize(child_parts.pop());
serializer.serializeIntoHash(data, type, record);
var id = record.get('id');
return this.ajax(this.buildURL(path, id), "PUT", { data: data });
}
....
});
此方法应该与将parent
类型添加到模型并确保相关的父模型ID也在模型上表示一致。对于PUT和DELETE请求,这不应该是一个问题,因为我们已经在商店中的对象上拥有父ID关系。
项目模型:
App.ProjectModel = DS.Model.extend({
name: DS.attr('string'),
createdAt: DS.attr('date'),
updatedAt: DS.attr('date'),
workspace : DS.belongsTo('workspace'),
parent: 'workspace',
....
});
这种方法似乎对我来说是错误的,就是用帖子创建新资源。我尝试过,但由于有效负载没有从相应的父ID的API服务器返回,我实际上无法访问它。
这是我糟糕的第一次尝试,这是行不通的。工作空间标识始终返回null。
createRecord: function(store, type, record) {
if (!record.get('parent') || null === record.get('parent')){
return this._super(store, type, record);
}
var data = {};
var serializer = store.serializerFor(type.typeKey);
var parent_type = record.get('parent');
var parent_id = record.get(parent_type).get('id');
var path = Ember.String.pluralize(parent_type) + '/' + parent_id + '/' + type.typeKey);
serializer.serializeIntoHash(data, type, record, { includeId: true });
return this.ajax(this._buildURL(path, null), "POST", { data: data });
},
在我保存记录之前,有什么想法可以获得父ID吗?
答案 0 :(得分:1)
我是您在问题中引用的解决方案的作者。
在创建新ProjectModel的路径中,模型钩子是什么样的?
假设您的Workspace路线类似于:
App.WorkspaceRoute = Ember.Route.extend({
model: function (params) {
return this.store.find('workspace', params.id);
}
});
然后你的Workspace Project添加/创建路径的模型钩子需要是这样的:
App.WorkspaceProjectAddRoute = Ember.Route.extend({
model: function () {
var workspace = this.modelFor('workspace');
return this.store.createRecord('project', {
workspace: workspace
});
}
}
我希望这有点意义......