Ember Cli Mirage:带有 JSONAPISerializer 的活动模型适配器
Ember Cli Mirage: Active Model Adapter with JSONAPISerializer
我正在实施 JSON API 结构(带有下划线属性)。
开发环境实际状态为:
我使用 Active Model Adapter 结构向后端请求资源,后端使用 JSON API 结构响应我。
在应用程序序列化程序中,我使用的是 JSONAPISerializer
。我重写方法:
serializeBelongsTo
keyForRelationship
keyForAttribute
serialize
serializeAttribute
serializeHasMany
对于开发,一切都适合我(Rails 中的后端与 Ember 沟通非常好)。
问题与Ember CLI Mirage 和约定有关(不确定是否有简单的解决方案,或者我需要再次覆盖此插件中的方法)。
Ember Cli Mirage 和测试环境的实际状态:
我正在使用 import { JSONAPISerializer } from 'ember-cli-mirage';
然后尝试操纵适当的请求,然后将其转换为 JSON API 格式。
它可以这样工作:
Ember 适配器(活动模型适配器格式 - 带下划线属性)---> Mirage Serializer 应该获取请求(查找之前在关联测试中创建的资源)然后用 JSON 响应它API 格式 ---> JSON API 序列化程序可以捕获它并填充 Ember DS.
目前,我缺少将所有情况下的序列化为 JSON API 标准(带有下划线的属性)
我应该在哪里进行此转换以尽量减少覆盖 JSONAPISerializer Mirage Serializer。
我注意到有一些帮手,但我很难将这些知识包装在一起
(http://www.ember-cli-mirage.com/docs/advanced/route-handlers#helpers)
更新:
来自后端的结构示例:
{
"data": {
"id": "6",
"type": "first_resource",
"attributes": {
"id": 6,
"my_attribute": "my_attribute"
},
"relationships": {
"second_resources": {
"data": [
{
"id": "16",
"type": "second_resource"
}
]
},
"third_resource_other_type": {
"data": {
"id": "1",
"type": "third_resource"
}
},
"fourth_resource": {
"data": {
"id": "1",
"type": "fourth_resource"
}
}
},
"links": {
"fifth_resources": "/api/v1/first_resources/6/fifth_resources"
}
},
"included": [
{
"id": "1",
"type": "fourth_resource",
"attributes": {
"id": 1,
"my_attribute": "my_attribute"
},
"links": {
"sixth_resource": "/api/v1/fourth_resources/1/sixth_resource"
}
},
{
"id": "16",
"type": "second_resource",
"attributes": {
"id": 16,
"my_attribute": "my_attribute"
},
"relationships": {
"eighth_resources": {
"data": []
}
},
"links": {
"seventh_resources": "/api/v1/second_resources/16/seventh_resources"
}
},
{
"id": "17",
"type": "second_resource",
"attributes": {
"id": 17,
"my_attribute": "my_attribute"
},
"relationships": {
"eighth_resources": {
"data": []
}
},
"links": {
"seventh_resources": "/api/v1/second_resources/17/seventh_resources"
}
},
{
"id": "15",
"type": "second_resource",
"attributes": {
"id": 15,
"my_attribute": "my_attribute"
},
"relationships": {
"eighth_resources": {
"data": [
{
"id": "26",
"type": "eighth_resource"
},
{
"id": "24",
"type": "eighth_resource"
}
]
}
},
"links": {
"seventh_resources": "/api/v1/second_resources/15/seventh_resources"
}
},
{
"id": "26",
"type": "eighth_resource",
"attributes": {
"id": 26,
"my_attribute": "my_attribute"
}
}
]
}
更新2
海市蜃楼响应的结构:
data: {
attributes: {
my_attribute: 'my_attribute',
second_resource_ids: [36, 37],
fifth_resource_ids: []
},
id: 11,
relationships: {
third_resource_other_type: {data: null}
fourth_resource: {data: null}
second_resources: {data: []}
},
type: "first_resources"
}
测试中的资源:
server.create('second-resource', {
id: 36,
first_resource_id: '11',
my_attribute: "my_attribute"
});
server.create('eighth-resource', {
id: 140,
second_resource_id: 37
});
server.create('eighth-resource', {
id: 141,
second_resource_id: 37
});
server.create('second-resource', {
id: 37,
first_resource_id: '11',
eighth_resource_ids: [140, 141]
});
server.create('first-resource', {
id: 11,
second_resource_ids: [36, 37]
});
first_resource海市蜃楼模型:
export default Model.extend({
third_resource_other_type: belongsTo(),
fourth_resource: belongsTo(),
fifth_resources: hasMany(),
second_resources: hasMany()
});
让我们试着关注一个单一的关系,因为您发布的问题涉及很多内容。我们来看看 second-resource
.
看起来 Mirage 正在 JSON:API 负载中 first_resource
主数据的 attributes
键下发回 second_resource_ids
。这告诉我 Mirage 认为 second_resource_ids
是 first_resource
的 属性 ,而实际上它是一种关系。
假设您的模型和关系设置正确,您需要调整在 Mirage 中创建数据的方式。
如果您查看 Associations section of the Defining Routes guide,您会看到以下消息:
Mirage's database uses camelCase for all model attributes, including foreign keys (e.g. authorId in the example above)
现在,您正在这样做:
server.create('second-resource', {
id: 36,
first_resource_id: '11',
my_attribute: "my_attribute"
});
server.create('first-resource', {
id: 11,
second_resource_ids: [36, 37]
});
但是从 Mirage 的角度来看,您需要使用 camelCase
ID,或者只是传递关系,才能正确设置这些。像这样:
let firstResource = server.create('first-resource', {
id: 11
});
server.create('second-resource', {
id: 36,
firstResource,
myAttribute: "my_attribute"
});
如果你愿意,你也可以在创建时传入外键 - 只要确保使用驼峰式:
server.create('second-resource', {
id: 36,
firstResourceId: '11',
myAttribute: "my_attribute"
});
请记住,属性和外键之类的格式决定(例如 some-attribute
与 some_attribute
或 relationship-id
与 relationship_id
)是在序列化器层。在处理 Mirage 的 ORM 和数据库时,无论您的 Serializer 发出什么格式,您都希望坚持 camelCase
。
有关更多信息,请查看文档中的这些部分:
我正在实施 JSON API 结构(带有下划线属性)。
开发环境实际状态为:
我使用 Active Model Adapter 结构向后端请求资源,后端使用 JSON API 结构响应我。
在应用程序序列化程序中,我使用的是 JSONAPISerializer
。我重写方法:
serializeBelongsTo
keyForRelationship
keyForAttribute
serialize
serializeAttribute
serializeHasMany
对于开发,一切都适合我(Rails 中的后端与 Ember 沟通非常好)。
问题与Ember CLI Mirage 和约定有关(不确定是否有简单的解决方案,或者我需要再次覆盖此插件中的方法)。
Ember Cli Mirage 和测试环境的实际状态:
我正在使用 import { JSONAPISerializer } from 'ember-cli-mirage';
然后尝试操纵适当的请求,然后将其转换为 JSON API 格式。
它可以这样工作:
Ember 适配器(活动模型适配器格式 - 带下划线属性)---> Mirage Serializer 应该获取请求(查找之前在关联测试中创建的资源)然后用 JSON 响应它API 格式 ---> JSON API 序列化程序可以捕获它并填充 Ember DS.
目前,我缺少将所有情况下的序列化为 JSON API 标准(带有下划线的属性)
我应该在哪里进行此转换以尽量减少覆盖 JSONAPISerializer Mirage Serializer。
我注意到有一些帮手,但我很难将这些知识包装在一起 (http://www.ember-cli-mirage.com/docs/advanced/route-handlers#helpers)
更新:
来自后端的结构示例:
{
"data": {
"id": "6",
"type": "first_resource",
"attributes": {
"id": 6,
"my_attribute": "my_attribute"
},
"relationships": {
"second_resources": {
"data": [
{
"id": "16",
"type": "second_resource"
}
]
},
"third_resource_other_type": {
"data": {
"id": "1",
"type": "third_resource"
}
},
"fourth_resource": {
"data": {
"id": "1",
"type": "fourth_resource"
}
}
},
"links": {
"fifth_resources": "/api/v1/first_resources/6/fifth_resources"
}
},
"included": [
{
"id": "1",
"type": "fourth_resource",
"attributes": {
"id": 1,
"my_attribute": "my_attribute"
},
"links": {
"sixth_resource": "/api/v1/fourth_resources/1/sixth_resource"
}
},
{
"id": "16",
"type": "second_resource",
"attributes": {
"id": 16,
"my_attribute": "my_attribute"
},
"relationships": {
"eighth_resources": {
"data": []
}
},
"links": {
"seventh_resources": "/api/v1/second_resources/16/seventh_resources"
}
},
{
"id": "17",
"type": "second_resource",
"attributes": {
"id": 17,
"my_attribute": "my_attribute"
},
"relationships": {
"eighth_resources": {
"data": []
}
},
"links": {
"seventh_resources": "/api/v1/second_resources/17/seventh_resources"
}
},
{
"id": "15",
"type": "second_resource",
"attributes": {
"id": 15,
"my_attribute": "my_attribute"
},
"relationships": {
"eighth_resources": {
"data": [
{
"id": "26",
"type": "eighth_resource"
},
{
"id": "24",
"type": "eighth_resource"
}
]
}
},
"links": {
"seventh_resources": "/api/v1/second_resources/15/seventh_resources"
}
},
{
"id": "26",
"type": "eighth_resource",
"attributes": {
"id": 26,
"my_attribute": "my_attribute"
}
}
]
}
更新2
海市蜃楼响应的结构:
data: {
attributes: {
my_attribute: 'my_attribute',
second_resource_ids: [36, 37],
fifth_resource_ids: []
},
id: 11,
relationships: {
third_resource_other_type: {data: null}
fourth_resource: {data: null}
second_resources: {data: []}
},
type: "first_resources"
}
测试中的资源:
server.create('second-resource', {
id: 36,
first_resource_id: '11',
my_attribute: "my_attribute"
});
server.create('eighth-resource', {
id: 140,
second_resource_id: 37
});
server.create('eighth-resource', {
id: 141,
second_resource_id: 37
});
server.create('second-resource', {
id: 37,
first_resource_id: '11',
eighth_resource_ids: [140, 141]
});
server.create('first-resource', {
id: 11,
second_resource_ids: [36, 37]
});
first_resource海市蜃楼模型:
export default Model.extend({
third_resource_other_type: belongsTo(),
fourth_resource: belongsTo(),
fifth_resources: hasMany(),
second_resources: hasMany()
});
让我们试着关注一个单一的关系,因为您发布的问题涉及很多内容。我们来看看 second-resource
.
看起来 Mirage 正在 JSON:API 负载中 first_resource
主数据的 attributes
键下发回 second_resource_ids
。这告诉我 Mirage 认为 second_resource_ids
是 first_resource
的 属性 ,而实际上它是一种关系。
假设您的模型和关系设置正确,您需要调整在 Mirage 中创建数据的方式。
如果您查看 Associations section of the Defining Routes guide,您会看到以下消息:
Mirage's database uses camelCase for all model attributes, including foreign keys (e.g. authorId in the example above)
现在,您正在这样做:
server.create('second-resource', {
id: 36,
first_resource_id: '11',
my_attribute: "my_attribute"
});
server.create('first-resource', {
id: 11,
second_resource_ids: [36, 37]
});
但是从 Mirage 的角度来看,您需要使用 camelCase
ID,或者只是传递关系,才能正确设置这些。像这样:
let firstResource = server.create('first-resource', {
id: 11
});
server.create('second-resource', {
id: 36,
firstResource,
myAttribute: "my_attribute"
});
如果你愿意,你也可以在创建时传入外键 - 只要确保使用驼峰式:
server.create('second-resource', {
id: 36,
firstResourceId: '11',
myAttribute: "my_attribute"
});
请记住,属性和外键之类的格式决定(例如 some-attribute
与 some_attribute
或 relationship-id
与 relationship_id
)是在序列化器层。在处理 Mirage 的 ORM 和数据库时,无论您的 Serializer 发出什么格式,您都希望坚持 camelCase
。
有关更多信息,请查看文档中的这些部分: