Rails ActiveModel :: Serializer在" data":parent中嵌套响应

时间:2016-05-29 11:23:18

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

我有一个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我的序列化程序可以工作,但我没有得到我想要的结构 - 数据父/容器丢失了。

有什么想法让我的序列化器正常工作?

2 个答案:

答案 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