【问题标题】:Passing options to ActiveModel serializer将选项传递给 ActiveModel 序列化程序
【发布时间】:2016-10-03 17:53:07
【问题描述】:

当使用控制器中的序列化程序时,我可以像这样向它传递额外的选项

render json: user, some_option: 'foobar

然后我可以在序列化程序中引用some_option

serialization_options[:some_option]

但是,如果我直接调用序列化程序

MySerializer.new(user, some_option: 'foobar')

我无法获得额外的选项,因为serialization_options 是一个空对象。

【问题讨论】:

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


    【解决方案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】:

      ActiveModel::Serializer 的 API 在 v0.9 中并没有真正保持一致,但是如果您升级到 v0.10,您可以使用 instance_options 方法来访问附加参数。不过,我很想知道在 v0.9 中是如何解析对象的

      【讨论】:

        【解决方案3】:

        您可以通过以下方式从父序列化程序传递参数(选项)并在子序列化程序中根据这些参数显示或隐藏属性。

        父序列化器:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-25
          • 1970-01-01
          • 2021-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多