我们有余烬.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中的createRecord
,updateRecord
和deleteRecord
方法以使用预期的URL。