Active Model Serializer为每个模型

时间:2016-11-04 10:46:14

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

我使用的是ActiveModelSerializer 0.10。我有一系列我要序列化的Account s。有没有办法为集合中的每个模型设置特定的序列化器?我希望我的控制器返回这样的内容:

{"accounts":
  [
    {"type":"Group","groupname":"A group","internal_info":"Sensitive info"},
    {"type":"User","first_name":"Bob","last_name":"Smith","internal_info":"Sensitive info"}
  ]
}

我的API分为两部分:用户API和管理员API。用户API使用ActiveModelSerializer自动找到的标准序列化程序。像这样的东西

render json: @accounts

会返回此信息(请注意,不包含敏感信息):

{"accounts":
  [
    {"type":"Group","groupname":"A group"},
    {"type":"User","first_name":"Bob","last_name":"Smith"}
  ]
}

admin API使用自定义序列化程序(它们包含更多详细信息,例如internal_info)。如何在管理API中呈现此类集合?我知道我可以使用

render json: @accounts, each_serializer: Admin::AccountSerializer

在大多数情况下都能很好地工作,但在这种特殊情况下,我有两种类型的Account s。我可以以某种方式将Admin::Account::GroupSerializer用于集合中的Group个对象,并将Admin::Accounts::UserSerializer用于集合中的User个对象吗?

1 个答案:

答案 0 :(得分:0)

我最终使用了Admin::AccountSerializer和条件。欢迎提供更好的解决方案。

class AccountSerializer < ActiveModel::Serializer
  attribute :groupname, if: :a_group?

  attribute :first_name, if: :a_user?
  attribute :last_name, if: :a_user?

  def a_group?
    object.class == Group
  end

  def a_user?
    object.class == User
  end
end
相关问题