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