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