使用Ember Data将POST请求发送到嵌套的API端点URL

时间:2014-08-30 20:23:15

标签: rest ember.js ember-data

我在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吗?

1 个答案:

答案 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
            });
        }
    }

我希望这有点意义......