Rails ActiveModel::Serializer 嵌套响应 "data": parent
Rails ActiveModel::Serializer nest response in "data": parent
我有一个 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
,我的序列化器可以工作,但我没有得到我想要的结构 - 数据父/容器丢失。
关于我需要做什么才能让我的序列化器正常工作有什么想法吗?
首先,除非您需要支持旧版 API,否则请使用 JSON:API 适配器:
By default ActiveModelSerializers will use the Attributes Adapter (no
JSON root). But we strongly advise you to use JsonApi Adapter, which
follows 1.0 of the format specified in jsonapi.org/format.
虽然没有人完全同意 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
出于任何原因,Rails 未找到与模型匹配的序列化程序。也许在你的带有序列化器的模型的约定 name/namespace 中缺少某些东西。
https://github.com/rails-api/active_model_serializers/blob/master/docs/general/rendering.md
但是,如果您显式声明序列化程序,它应该可以工作。
render json: @post, serializer: PostPreviewSerializer
我有一个 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
,我的序列化器可以工作,但我没有得到我想要的结构 - 数据父/容器丢失。
关于我需要做什么才能让我的序列化器正常工作有什么想法吗?
首先,除非您需要支持旧版 API,否则请使用 JSON:API 适配器:
By default ActiveModelSerializers will use the Attributes Adapter (no JSON root). But we strongly advise you to use JsonApi Adapter, which follows 1.0 of the format specified in jsonapi.org/format.
虽然没有人完全同意 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
出于任何原因,Rails 未找到与模型匹配的序列化程序。也许在你的带有序列化器的模型的约定 name/namespace 中缺少某些东西。
https://github.com/rails-api/active_model_serializers/blob/master/docs/general/rendering.md
但是,如果您显式声明序列化程序,它应该可以工作。
render json: @post, serializer: PostPreviewSerializer