Rails ActiveModel::Serializer 嵌套响应 "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适配器:

默认情况下,ActiveModelSerializers 将使用属性适配器(否) JSON 根)。但我们强烈建议您使用 JsonApi 适配器,它 遵循 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

出于任何原因,Rails 都没有找到与模型匹配的序列化程序。使用序列化程序的模型的约定名称/命名空间中可能缺少某些内容。

https://github.com/rails-api/active_model_serializers/blob/master/docs/general/rendering.md

但是,如果显式声明序列化程序,它应该可以工作。

  render json: @post, serializer: PostPreviewSerializer

相关内容

最新更新