【发布时间】:2018-12-25 06:21:06
【问题描述】:
我正在与我的 JSON 渲染作斗争。我要遵守简单的JSend response format。
基本上我想要的是响应中的状态和数据。
我已将我的 Serializer 默认适配器设置为 json :
ActiveModelSerializers.config.adapter = :json
我的序列化器很简单:
class RecordSerializer < ActiveModel::Serializer
attributes :id, :raw
end
所以当我这样做时:
record_list = @current_user.records
render json: record_list
我明白了:
{
"records": [
{
"id": 1,
"raw": "aaa"
},
{
"id": 2,
"raw": "bbb"
}
]
}
现在棘手的部分是,如果我想在顶部添加一个 data 键,它会覆盖我的 records 键而不是在顶部添加它。
render json: record_list, root: "data"
给这个:
{
"data": [
{
"id": 1,
"raw": "aaa"
},
{
"id": 2,
"raw": "bbb"
}
]
}
另外,如何添加其他键,例如 status 键?一旦我创建了一个自定义哈希,序列化程序就会被忽略。比如这个:
render json: {:status=>"success", :code=>200, :message=>"Hello", data: record_list}
将返回这个:
{
"status": "success",
"code": 200,
"message": "Hello",
"data": [
{
"id": 1,
"raw": "aaa",
"created_at": "2018-07-16T19:49:32.960Z",
"updated_at": "2018-07-16T19:49:32.960Z",
},
{
"id": 2,
"raw": "bbb",
"created_at": "2018-07-16T20:01:55.804Z",
"updated_at": "2018-07-16T20:01:55.804Z",
}
]
}
所以我想我理解 render json: my_variable 单独将理解将 my_variable 转换为选择的 json 序列化适配器但不能使用自定义哈希?
我当然可以这样做:
record_list = {}
record_list["records"] = @current_user.records.select(:id, :raw)
但我觉得这不是正确的方法,然后序列化器就没用了。
谢谢!
【问题讨论】:
-
您是否考虑过退出序列化程序并改用jbuilder?
-
您可能想研究一下 json:api 和 graphQL,它们都具有可以为您设置生成的序列化程序的宝石,这些序列化程序几乎可以开箱即用,并提供比 jsend 更多的结构和功能跨度>
-
@robertoplancarte JSON API 和 graphQL 对我的使用来说似乎很重,所以这就是我想要一些轻量级的原因。
-
@andrew21 我会看看它,但这似乎绕过了这个问题,并没有真正解决它。还是谢谢你的建议
-
对于我基于 Rails 的 API 应用程序,我最初使用 representable 来生成 JSON 响应,但是随着我的 JSON 模板的增长,它没有提供一种干净的方法来重用已经定义的表示,因此我切换到使用rabl-rails,从那时起我成功且令人满意地使用它来生成 JSON 响应。 (在下一条评论中继续)
标签: ruby-on-rails json ruby-on-rails-5 active-model-serializers rails-api