【问题标题】:ActiveModel::Serializer::CollectionSerializerActiveModel::Serializer::CollectionSerializer
【发布时间】:2016-03-17 18:14:18
【问题描述】:

我正在使用 Active Model Serializers v0.10.0.rc4

我想生成如下所示的 json:

{
  "posts": [
    { "post": {"id": 2, "name": "foo"} },
    { "post": {"id": 3, "name": "bar"} }
  ],
  "next_page": 3
}

我知道基本的:

render json: posts, each_serializer: PostSerializer

会产生这样的json:

[
  {"id": 2, "name": "foo"}
  {"id": 3, "name": "bar"}
]

我尝试了以下方法:

控制器:

render json: posts, serializer: PostsSerializer

posts_serializer:

class PostsSerializer < ActiveModel::Serializer
  attributes :posts, :next_page

  def posts
    ActiveModel::Serializer::CollectionSerializer.new(object,
      each_serializer: PostSerializer,
      root: "post"
    )
  end

  def next_page
    3 
  end
end

但这会产生这样的json:

{
  "posts": [
    {
      "object": {"id": 2, "name": "foo"},
      "instance_options": {"each_serializer: {}", "root": "post" }
    },
    {
      "object": {"id": 3, "name": "bar"},
      "instance_options": {"each_serializer: {}", "root": "post" }
    },
  ],
  "next_page": 3
}

有人知道我怎样才能实现所需的架构吗?

【问题讨论】:

  • 我目前正在处理同样的问题。如果您解决了这个问题,请告诉我。

标签: ruby ruby-on-rails-4 active-model-serializers


【解决方案1】:

最后我没有使用CollectionSerializer。这就是我所选择的:

控制器:

render json: posts, serializer: PostsSerializer

posts_serializer:

class PostsSerializer < ActiveModel::Serializer
  attributes :posts, :next_page

  def posts
    object.map do |p|
      ActiveModel::SerializableResource.new(p, adapter: :json)
    end
  end

  def next_page
    # todo
  end
end

指定json 适配器可确保post 元素具有所需的根节点。

虽然我理解为数组项指定根节点可能不是常规的,但此 api 需要它。

【讨论】:

    【解决方案2】:

    您需要的 JSON 结果类似于JSON API 格式中指定的结果。要使用active_model_serializers 实现此目的,您需要使用JsonApi 适配器。你可以在初始化文件中指定这个:

    ActiveModelSerializers.config.adapter = :json_api
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多