如何在 Active Model Serializer 0.10 class 中选择性地包含/删除值

how to optionally include / delete values in an Active Model Serializer 0.10 class

我有以下 ASM 0.10:

class UserMicroSerializer < ActiveModel::Serializer
  attributes :id, :name, :is_friend


  def is_friend
    @instance_options[:is_friend]
  end
end

但也希望支持没有 is_friend 属性。

我尝试过各种方法,例如:

class UserMicroSerializer < ActiveModel::Serializer
  attributes :id, :name
  if @instance_options[:is_friend]
    attributes :is_friend
  end


  def is_friend
    @instance_options[:is_friend]
  end
end

但收到错误消息:

NoMethodError: undefined method `[]' for nil:NilClass

如何让@instane_options 有条件地包含 is_friend

如果您可以有条件地在控制器中使用不同的序列化程序,那么您也许可以做到这一点

class SimpleUserMicroSerializer < ActiveModel::Serializer
  attributes :id, :name
end

通过子类化简单的序列化程序,您没有太多代码重叠

class UserMicroSerializer < SimpleUserMicroSerializer
  attributes :is_friend

  def is_friend
    @instance_options[:is_friend]
  end

end

您也可以从控制器发送 { scope: 'is_friend' } 然后将其签入序列化程序。

class UserMicroSerializer < ActiveModel::Serializer
 attributes :id, :name, :is_friend

  def filter(keys)
    keys.delete :is_friend if scope and scope[:is_friend]
    super(keys)
  end
end