我正在Rails 5.2中使用REST API,并且正在遵循JSON API规范。我的JSON是这样的:
{
"data":{
"attributes":{
"name":"Gleydson",
"age":"30"
},
"relationships":{
"occupation":{
"data":{
"attributes": {
"name": "Teacher",
}
}
}
}
}
}
我有以下方法 user_params :
params.require(:data).require(:attributes)
.permit(:name, :age,
relationships: { occupation: { data: { attributes: [:name] } } })
但是当我打印方法的返回时,什么也不会返回
答案 0 :(得分:1)
您是否曾经研究过使用gem从Ruby对象转换为JSON:API序列化对象。 JSONAPI::Resources可以帮助您正确设置参数,因为您只需定义JSONAPI:Resource并告知允许的内容即可。
我认为您的问题的一部分是在JSON:API中,属性和关系键是同级
user_params:{data:{attributes:{name:x,age:y,relationships:{z}}}}
jsonapi是:{data:{attributes:{name:x,age:y},relationships:{z}}}
答案 1 :(得分:0)
在JSON API规范中,“属性”和“关系”是同级兄弟。
在您的示例中,您将“关系”嵌套在“属性”中。
代替尝试:
params.require(:data).permit({
attributes: [:name, :age],
relationships: {
occupation: {
data: {
attributes: [:name]
}
}
}
})
答案 2 :(得分:-1)
根据 spec,属性不应显示在关系的数据成员下。关系的数据成员是一个资源标识符对象,这意味着它仅(且必须)包含类型和 id。
对于 JSON:API 合规性检查,您可能需要查看新的 ruby gem easy-jsonapi。它有一个非常容易使用的中间件和响应验证器,带有直观的错误消息,告诉您为什么您的文档、请求和响应不合规。它还与 JSONAPI-SERIALIZER 搭配得很好,正如@robertoplancarte 所建议的那样,它可以获取您的 ruby 对象并将它们序列化为 JSON:API 兼容的 JSON 文档。