【发布时间】:2018-07-05 04:29:12
【问题描述】:
我在使用 Ember/Ember-data 时遇到了一些错误。这是我的场景:
客户端登陆
/路由,Ember 从/api/v1/videos?limit=8加载数据。响应来自使用 active_model_serializers 的 rails-api 后端,确保响应符合 JSON API。现在商店已经加载了 8 个任意视频。DOM 中的每个视频组件都有一个指向用户页面的链接(视频
belongsTo一个用户和一个用户hasMany视频)。客户端点击
link-to,该/users/1代表ID为1的用户该路由的模型挂钩仅加载单个用户记录。用户记录具有以下负载:
{ "data": { "id": "1", "relationships": { "videos": { "data": [], "links": { "related": "/api/v1/videos?user_id=1" } }, }, "type": "users" } }
问题在于 ember 不会自动发送对 /api/v1/videos?user_id=1 的请求(大概是因为类似的请求 /api/v1/videos?limit=8 已经发生了)。
如果我直接加载 /users/1 页面,那么 Ember 很智能,会自动从 /api/v1/videos?user_id=1 端点加载数据。
我怀疑 Ember 被以下事实愚弄了:对视频端点的类似请求已经使用不同的查询参数发生了。最终结果是我的应用在用户页面上没有显示任何数据。
解决此问题的一种方法是不使用链接/相关语法,而是使用视频 ID 填充 "data": [],,这将导致 ember 为 n 个视频发送 n 个请求。这可行,但对于用户页面可能包含数百个视频的大型应用程序来说是不可接受的。
我该如何解决这个问题?
您可以看到链接/相关结构的 active_model_serializers 设置应该是tailored specifically for ember-data。
编辑:我尝试在 active_model_serializers 中使用 include_data false 摆脱 data: [],但没有帮助。
编辑 2:这是/api/v1/videos?limit=8 的有效负载:
{
"data": [
...
{
"attributes": {
...
},
"id": "325",
"relationships": {
"user": {
"data": {
"id": "1",
"type": "users"
}
}
},
"type": "videos"
},
...
]
}
换句话说,该负载中的某些视频可能属于我们稍后将加载的用户。
编辑 3:我在用户路由中这样做是一种解决方法:
afterModel(user) {
user.hasMany('videos').reload();
})
这有点愚蠢,但现在可以完成工作。
编辑 4:我尝试升级到 ember 和 ember-data v3。行为仍然存在。
【问题讨论】:
-
请显示
/api/v1/videos?limit=8的有效载荷 -
我在我这边测试了你的例子,你的用例对我有用。所以它不是 emberjs/data 错误。请检查您指向用户/显示页面的链接。如果您从 videos-index 切换到 users/show,请检查您的 users/show-model 钩子是否被调用。
-
@Lux @wuarmin 我更新了
/api/v1/videos?limit=8的有效载荷。我仍然有这个问题。 -
此响应是否包含
included属性中的任何内容? -
/api/v1/videos?limit=8响应?它没有。
标签: ruby-on-rails ember.js ember-data active-model-serializers json-api