我有一个rails应用程序,我使用gem active_model_serializers
。在我的回复中,我想将结果嵌套在"data":
父级中。目前,当我没有获得任何响应数据时,我得到以下JSON:
[]
我想要的是这样的:
{
"data": []
}
在我有数据的情况下,我也想使用相同的格式,如下所示:
{
"data": [
{
"id": 135,
[...]
我已经设法使用render json
获得了我想要的结构,如下所示:
render json: { data: respond_values}
但在这种情况下,我的序列化程序会被忽略,并且我的模型中的所有属性都会被返回。我的序列化器看起来像这样:
class TranslationSerializer < ActiveModel::Serializer
attributes :id, :value, :created_at, :updated_at, :language_id
has_one :language
has_one :localized_string, serializer: LocalizedStringParentSerializer
end
如果我改为使用respond_with
我的序列化程序可以工作,但我没有得到我想要的结构 - 数据父/容器丢失了。
有什么想法让我的序列化器正常工作?
答案 0 :(得分:2)
首先,除非您需要支持旧版API,否则请使用JSON:API适配器:
默认情况下,ActiveModelSerializers将使用属性适配器(没有 JSON root)。但我们强烈建议您使用JsonApi Adapter 遵循jsonapi.org/format中指定格式的1.0。
虽然没有人完全同意JSON中的所有设计决策:API得到了前端框架(如Ember和Angular)的广泛支持,并可能获得进一步的推动。
否则您需要创建自己的适配器,因为JSON适配器不允许您设置根密钥。
# lib/active_model_serializers/adapters/bikeshed_adapter.rb
module ActiveModelSerializers
module Adapters
class BikeshedAdapter < Json
def root
:data
end
end
end
end
ActiveModelSerializers.config.adapter = :bikeshed
答案 1 :(得分:0)
出于任何原因,Rails没有找到与模型匹配的Serializer。使用序列化程序的模型的约定名称/命名空间中可能缺少某些内容。
https://github.com/rails-api/active_model_serializers/blob/master/docs/general/rendering.md
但是,如果您明确声明了序列化程序,它应该可以工作。
render json: @post, serializer: PostPreviewSerializer