Ember模型关系不匹配API

时间:2016-04-18 05:37:26

标签: ember.js ember-data

我有两个看起来像这样的模型:

// models/database.js
export default DS.Model.extend({
   title: DS.attr(),
   /*...*/
   documents: DS.hasMany('document')
});

// models/document.js
export default DS.model.extend({
   name: DS.attr(),
   /*...*/
   database: DS.belongsTo('database')
});

也有一些路线

Router.map(function() {
  this.route('databases', function() {
    this.route('database', { path: ":database_id" }, function() {
      this.route('documents');
    });
  });
});

如果什么都没有,我打电话给 / database / [ID] / documents

我认为问题是我正在使用JSON HAL API,当我在API上请求数据库时,我收到了这种响应。

{
"_embedded": {
    "databases": [
        {
            "_links": {
                "self": {
                    "href": "<API_URL>/databases/7ec39267b544424c/",
                    "reference": "7ec39267b544424c",
                    "title": "00000006"
                }
            },
            "database": {
                "name": "00000006",
                "reference": "7ec39267b544424c",
                "title": "****"
            }
        },
        {
            "_links": {
                "self": {
                    "href": "<API_URL>/databases/aace19af004144a4/",
                    "reference": "aace19af004144a4",
                    "title": "00000007"
                }
            },
            "database": {
                "name": "00000007",
                "reference": "aace19af004144a4",
                "title": "******"
            }
        }
    }]
}

正如您所看到的,JSON上没有返回文档属性。 如果我想要数据库的文档,我必须调用 [API_URL] / databases / [ID] / domains / [ID] / documents

还有一种方法可以通过指定文档在此URL( / databases / [ID] / domains / [ID] / Documents )中恢复来将文档链接到数据库吗?

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找的是HAL APIJSON API转换器。为了避免手动执行此操作,我建议使用http://github.com/201-created/ember-data-hal-9000 Ember插件,我已经用它来使Ember Data与Spring Boot一起玩得很好。

如果你想在这里看到一个简单的例子我的client-sideserver-side演示应用。

此外,如果你很好奇Ember和JSON API不使用HAL,你可以在这里阅读JSON API - FAQ on HAL

答案 1 :(得分:0)

我找到了解决方案。

我在hal序列化器中覆盖了extractRelationships方法,如下所示:

extractRelationships(modelClass, resourceHash, included) {
    resourceHash._links["documents"] = {
        "href" : "/databases/" + resourceHash.id + "/domains/" + (resourceHash.name || resourceHash[modelClass.modelName].name) + "/documents/"
    };
    return this._super(modelClass, resourceHash, included);
}

我只需为API返回的每个数据库添加一个文档链接。

我修改了文件的路线

export default Ember.Route.extend(AuthenticatedRouteMixin, {
    model() {
        return this.modelFor('databases.database').get('documents');
    }
});

现在它完美无缺。