当使用来自控制器的串行器时,我可以像这样传递额外的选项
render json: user, some_option: 'foobar
然后我可以在序列化程序中引用some_option
作为serialization_options[:some_option]
但是,如果我直接将序列化器称为
MySerializer.new(user, some_option: 'foobar')
我无法获得额外的选项,因为serialization_options
是一个空对象。
答案 0 :(得分:1)
ActiveModel :: Serializer的API在v0.9中并没有真正一致,但是如果升级到v0.10,则可以使用instance_options
方法访问其他参数。但是,我很想知道如何在v0.9中解析对象,尽管
答案 1 :(得分:1)
对于v0.9
您可以拨打以下电话:
MySerializer.new(user).as_json({some_option: 'foobar'})
如果您在另一个序列化程序中执行此操作,并且您还需要传递范围和当前的serialization_options,则可以执行以下操作:
class MyParentSerializer
has_one :user
def user
MySerializer.new(object.user, { scope: scope }).as_json(serialization_options.merge({ some_option: 'foobar' }))
end
end
答案 2 :(得分:0)
这里是如何从父序列化器传递参数(选项),以及在子序列化器中基于这些参数显示或隐藏属性的方法。
父级序列化器:
class LocationSharesSerializer < ActiveModel::Serializer
attributes :id, :locations, :show_title, :show_address
def locations
ActiveModelSerializers::SerializableResource.new(object.locations, {
each_serializer: PublicLocationSerializer,
params: {
show_title: object.show_title
},
})
end
end
子序列化器
class PublicLocationSerializer < ActiveModel::Serializer
attributes :id, :latitude, :longitude, :title, :directions, :description, :address, :tags, :created_at, :updated_at, :photos
def title
object.title if @instance_options[:params][:show_title]
end
end