将“命名空间”添加到序列化器

问题描述 投票:1回答:2

我的数据库中存在User模型,但是我想返回active_model_serializers gem的json响应,其中user属性被封装/嵌套在player命名空间中,而该命名空间在db中不存在(例如是虚拟的,这是任意预期的响应)。

而不是:

{
    "email": "[email protected]",
    "first_name": "Hey",
    "last_name": "Hoo",
    "birthdate": "1540-05-05",
    "phone_number": "856539571"
}

我想拥有:

{
    "player":
    {
        "email": "[email protected]",
        "first_name": "Hey",
        "last_name": "Hoo",
        "birthdate": "1540-05-05",
        "phone_number": "856539571"
    }
}
ruby-on-rails ruby active-model-serializers serializer
2个回答
1
投票

在UserSerializer类中,定义根属性。例如:

class UserSerializer < ActiveModel::Serializer
  root :player

  ...
end


0
投票

当Nwocha的答案正确时,我会在上面添加更多详细信息。

[documentation说:

覆盖资源根仅在使用JSON适配器时适用。

通常,资源根源于要序列化的资源的类名。例如UserPostSerializer.new(UserPost.new)将根据适配器集合复数规则以根user_postuser_posts进行序列化。

[在初始化程序(ActiveModelSerializers.config.adapter = :json)中使用JSON适配器,或在渲染调用中传递适配器时,可以通过将根作为参数传递给render来指定根。例如:

  render json: @user_post, root: "admin_post", adapter: :json

这将呈现为:


  {
    "admin_post": {
      "title": "how to do open source"
    }
  }

Note属性适配器(默认)不包括资源根。如果使用:json_api适配器,您也将无法创建单个顶级根。

© www.soinside.com 2019 - 2024. All rights reserved.