我们将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"}}}
答案 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中的createRecord
,updateRecord
和deleteRecord
方法以使用预期的网址。< / p>