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

时间:2016-11-23 00:39:31

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

我有以下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

2 个答案:

答案 0 :(得分:2)

如果您可以在控制器中有条件地使用其他序列化程序,那么您可以执行此操作

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

通过继承简单的序列化程序,您不会有太多的代码重叠

class UserMicroSerializer < SimpleUserMicroSerializer
  attributes :is_friend

  def is_friend
    @instance_options[:is_friend]
  end

end

答案 1 :(得分:0)

您也可以从控制器发送{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