从嵌套资源进行POST时出现意外的URL

时间:2014-03-01 01:06:04

标签: ember.js ember-data

我们将ember.js资源和路线设置为组织内的GET用户,其网址看起来像/ orgs / <org-id> / users。注意:ember URL和API URL都使用此约定。

当我们获得组织时,ember数据使用URL / orgs / <org-id>执行GET,返回的JSON包含指示用户从URL / orgs / <org-id> / users获取用户的链接。获得任何给定组织的用户都很顺利。

当我们发布一个新用户时,我们发现将数据POST到了URL / users,这不是我们所期望的。相反,我们希望将ember数据发布到我们获得用户的相同位置(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"}}]}

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

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

1 个答案:

答案 0 :(得分:0)

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

在这种情况下我可能会看到的是将User模型子类化为:

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方法以使用预期的网址。< / p>