【问题标题】:Rails ActiveModel::Serializer nest response in "data": parentRails ActiveModel::Serializer 在“数据”中嵌套响应:父
【发布时间】:2016-09-27 07:37:18
【问题描述】:

我有一个使用 gem active_model_serializers 的 rails 应用程序。在我的回复中,我想将我的结果嵌套在 "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,我的序列化程序可以工作,但我没有得到我想要的结构 - 数据父/容器丢失。

关于让我的序列化程序正常工作需要做些什么的任何想法?

【问题讨论】:

  • 试试:render json: respond_values, each_serializer: TranslationSerializer, root: 'data'

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


【解决方案1】:

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

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

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

  render json: @post, serializer: PostPreviewSerializer

【讨论】:

    【解决方案2】:

    首先,除非您需要支持旧版 API,否则请使用 JSON:API 适配器:

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

    【讨论】:

    • 谢谢,我尝试使用 json_api 适配器中的构建,但我无法让它工作 (github.com/rails-api/active_model_serializers/blob/master/docs/…)。我创建了一个这样的初始化程序:initializers/active_model_serializers.rbActiveModelSerializers.config.adapter = :json_api,但什么也没发生。
    • 您尝试重新启动服务器了吗?服务器启动时读取初始化文件。
    • 是的,我做到了。但它似乎没有做任何事情。
    • 我唯一做的就是添加初始化程序。我错过了什么吗?
    • 不,除了添加设置ActiveModelSerializers.config.adapter之外,您不需要做任何事情。你的初始化器在/config/initializers 中吗?尝试将日志语句 Rails.logger.info "Setting ActiveModelSerializers to use json_api adapter." 添加到您的初始化程序以确保正在运行。
    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2021-10-09
    • 2017-11-16
    相关资源
    最近更新 更多