从嵌套资源发布时出现意外 URL



我们有余烬.js资源和路由设置,以从组织内获取用户,其URL看起来像/orgs/<org-id>/users。注意:余烬 URL 和 API URL 都使用此约定。

当我们得到一个组织时,余烬数据使用 URL/orgs/<org-id>执行 GET,返回的 JSON 包含告诉它从 URL/orgs/<org-id>/users 获取用户的链接。为任何给定组织获取用户都进展顺利。

当我们发布一个新用户时,我们发现余烬数据发布到 URL/users,这不是我们所期望的。相反,我们希望余烬数据发布到我们获取用户的同一位置(URL/orgs/<org-id>/users)。

我们

是否需要编写自定义代码来实现这一点,或者我们是否缺少处理 ember 数据的方式(即返回的 JSON、路由配置等)?

App.Router.map(function () {
  this.resource('orgs', function () {
    this.resource('org', { path : ':org-id' }, function () {
      this.resource('users', function () {
        this.resource('user, { path : ':user-id' }, function () {
        });
      });
    });
  });
});

GET for/orgs 返回以下 JSON

{"orgs":[{"org_name":"Test Org","id":10001,"links":{"users":"/orgs/10001/users"}}]}

GET for/orgs/<org-id>返回以下 JSON

{"org":{"org_name":"Test Org","id":10001,"links":{"users":"/orgs/10001/users"}}}

目前,这似乎是异步关系的默认行为。

在这种情况下,我可能会考虑做的是将您的用户模型子类化如下:

User = DS.Model.extend ... # keep as is
Organization = DS.Model.extend
  orgName: DS.attr('string')
  users: DS.hasMany('organizationUser') # instead of DS.hasMany('user')
OrganizationUser = User.extend()
OrganizationUserAdapter = ApplicationAdapter.extend
  buildURL: (type, id) ->
    # You'll need to do some mangling here to get the record's organizationId
    # (perhaps by passing it from wherever `this.ajax(this.buildURL( ...`
    # is called in your adapter
OrganizationUserSerializer = ApplicationSerializer.extend
  serializeIntoHash: (hash, type, record, options) ->
    hash['user'] = @serialize(record, options) # Use 'user' as root instead of 'organizationUser'
您可能需要

在适配器和序列化程序中覆盖其他一些默认值,但我过去在做类似的事情时取得了一些成功。

编辑:更简单的方法可能是坚持使用常规用户模型并覆盖UserAdapter中的createRecordupdateRecorddeleteRecord方法以使用预期的URL。