将选项传递给ActiveModel序列化程序

时间:2016-06-03 15:26:04

标签: ruby-on-rails ruby-on-rails-4 serialization activemodel

当使用来自控制器的串行器时,我可以像这样传递额外的选项

render json: user, some_option: 'foobar

然后我可以在序列化程序中引用some_option作为serialization_options[:some_option]

但是,如果我直接将序列化器称为

MySerializer.new(user, some_option: 'foobar')我无法获得额外的选项,因为serialization_options是一个空对象。

3 个答案:

答案 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