Rest 使用余烬数据向嵌套的API端点URL发送POST请求

Rest 使用余烬数据向嵌套的API端点URL发送POST请求,rest,ember.js,ember-data,Rest,Ember.js,Ember Data,我在尝试解决向嵌套API资源路由发送POST请求的问题时遇到了几个问题 见: -[使用Ember Data()向嵌套的API端点URL发送REST请求] - 我已经开始在RestaAdapter上重载createRecord、updateRecord和deleteRecord方法,以尝试某种黑客解决方案来构建正确的URL 以下是解决方案中的updateRecord方法: App.UserAdapter = DS.RESTAdapter.extend({ updateRecord: fu

我在尝试解决向嵌套API资源路由发送POST请求的问题时遇到了几个问题

见: -[使用Ember Data()向嵌套的API端点URL发送REST请求] -

我已经开始在RestaAdapter上重载createRecord、updateRecord和deleteRecord方法,以尝试某种黑客解决方案来构建正确的URL

以下是解决方案中的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 });
    }
    ....
});
这种方法应该与向模型中添加
父类
类型并确保相关的父模型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',
    ....
});
对于我来说,这个方法出现错误的地方是使用post创建新资源。我已经尝试过了,但是由于没有使用相关的父ID从API服务器返回有效负载,我实际上没有访问它的权限

这是我糟糕的第一次尝试,不起作用。工作区id总是返回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?

我是您在问题中引用的解决方案的作者

在创建新ProjectModel的路径中,您的模型挂钩看起来是什么样的

假设您的工作区路径如下所示:

App.WorkspaceRoute = Ember.Route.extend({
    model: function (params) {
        return this.store.find('workspace', params.id);
    }
});
App.WorkspaceProjectAddRoute = Ember.Route.extend({
     model: function () {
            var workspace = this.modelFor('workspace');

            return this.store.createRecord('project', {
                workspace: workspace
            });
        }
    }
然后,您的工作区项目“添加/创建路由”的模型挂钩需要类似于:

App.WorkspaceRoute = Ember.Route.extend({
    model: function (params) {
        return this.store.find('workspace', params.id);
    }
});
App.WorkspaceProjectAddRoute = Ember.Route.extend({
     model: function () {
            var workspace = this.modelFor('workspace');

            return this.store.createRecord('project', {
                workspace: workspace
            });
        }
    }

我希望这是有意义的…

看起来您在Ember数据中做了很多工作,有什么原因吗?Ember在Ember数据之外工作得非常好。您可能希望包括您的模型,这有点难以理解上下文。我有一个相关的问题,我建议您考虑嵌套模型s与嵌套的api端点相对应。例如,如果您的api端点是
/foo/bar
,并且是'/foo/baz',那么您可能会将
bar
baz
作为您的模型放在ember端的
/models/foo
目录下。这将为模型命名名称,并且构建的api将具有'/foo'/'作为前缀。根据您的模型,您可能必须编写自己的序列化程序并正确嵌套路由,但覆盖
createRecord
和其他挂钩似乎有点太粗糙了。@Kingpin2k,我确实认真考虑过手动执行ajax请求并使用store.pushPayload('type',data')为了让这一切顺利进行。现在,我要努力保持在余烬数据的范围内。也许我太理想化了?如果你注销工作区记录,它有什么内容吗?填充这些记录的原始数据是什么样子的?