如何将参数传递给ActiveModel :: ArraySerializer?

时间:2015-09-07 13:08:56

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

我需要从ItemSerializer中访问current_user_id。 有没有办法实现它?即使是肮脏的黑客,我也很好。)

我知道serialization_options哈希的存在(来自How to pass parameters to ActiveModel serializer )但它只适用于render命令(如果我是对的)所以可以这样做:

def action
  render json: @model, option_name: value
end

class ModelSerializer::ActiveModel::Serializer
  def some_method
    puts serialization_options[:option_name]
  end
end

但在我的情况下,我使用ArraySerializerrender命令之外生成json哈希,如下所示:

positions_results = {}    
positions_results[swimlane_id][column_id] =
  ActiveModel::ArraySerializer.new(@account.items,
                                   each_serializer: ItemSerializer,
                                   current_user_id: current_user.id) # <---- Does not work

2 个答案:

答案 0 :(得分:7)

您可以通过两种方式实现:

  • 将它们传递给serialization_options,但据我所知,正如您所说,您只能在控制器的回复中使用它:

  • 如你所述,将它们传递给contextscope,它几​​乎相同:

    # same as with scope 
    ActiveModel::ArraySerializer.new(@account.items, each_serializer: ItemSerializer, context: {current_user_id: 31337})
    
    # In serializer:
    class ItemSerializer < ActiveModel::Serializer
        attributes :scope, :user_id
    
        def user_id
          context[:current_user_id]
        end
    end
    

答案 1 :(得分:5)

基本上答案是: https://github.com/rails-api/active_model_serializers/issues/510

ActiveModel::ArraySerializer.new(
                            @account.items,
                            each_serializer: ItemSerializer,
                            scope: {current_user_id: 31337})

然后在ItemSerializer

class ItemSerializer < ActiveModel::Serializer
    attributes :scope, :user_id

    def user_id
      # scope can be nil
      scope[:current_user_id]
    end
end

希望它可以帮助任何人:)