【问题标题】:How to pass parameters to ActiveModel serializer如何将参数传递给 ActiveModel 序列化程序
【发布时间】:2014-04-28 17:34:45
【问题描述】:

我正在使用active model serializer。我有一个有很多活动的模型事件。

我想返回包含前 n 个活动的活动。我想我应该将参数 n 传递给事件序列化程序。

【问题讨论】:

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


    【解决方案1】:

    ~> 0.10.0 版本中,您需要使用@instance_options。使用上面的@Jon Gold 示例:

    # controller
    def action
      render json: @model, option_name: value
    end
    
    # serializer
    class ModelSerializer::ActiveModel::Serializer
      def some_method
        puts @instance_options[:option_name]
      end
    end
    

    【讨论】:

      【解决方案2】:

      传入的选项可通过@options 哈希获得。所以如果你这样做:

      respond_with @event, activity_count: 5
      

      您可以在序列化程序中使用@options[:activity_count]

      【讨论】:

      • 从 AMS 0.9.0 开始,这不起作用。由于 AMS 没有文档,没有 wiki,也没有讨论板,因此目前这似乎是一条死胡同。
      • 这似乎不起作用。这方面的文档在哪里?
      • 它在 0.8 分支上,而不是在 master 上。 github.com/rails-api/active_model_serializers/tree/0-8-stable我们真的需要这个。 github.com/rails-api/active_model_serializers/issues/599
      • 尽可能安全地使用 0.8 版本,因为它是 AMS 团队推荐的。 we recommend that any new projects you start use the latest 0.8.x version of this gem. This version is the most widely used, and will most closely resemble the forthcoming release.
      • @options 似乎对我不起作用,事实证明哈希改为@instance_options。那是为我做的。
      【解决方案3】:

      @options 哈希在 0.9 中被删除;看起来等效的方法是 recently added -

      def action
        render json: @model, option_name: value
      end
      
      class ModelSerializer::ActiveModel::Serializer
        def some_method
          puts serialization_options[:option_name]
        end
      end
      

      【讨论】:

      • 我有 gem 版本 0.9(更新它只是为了确定),但选项和 serialization_options 都不起作用。这是错误未定义的局部变量或方法`serialization_options'
      • ganeshran 是对的。 serialization_options 应该适用于 0.9,但似乎使用 0.8 和 @options 是目前唯一有效的方法。
      【解决方案4】:

      使用 0.9.3 你可以像这样使用#serialization_options...

      # app/serializers/paginated_form_serializer.rb
      class PaginatedFormSerializer < ActiveModel::Serializer
        attributes :rows, :total_count
      
        def rows
          object.map { |o| FormSerializer.new(o) }
        end
      
        def total_count
          serialization_options[:total_count]
        end
      end
      
      # app/controllers/api/forms_controller.rb
      class Api::FormsController < Api::ApiController
        def index
          forms = Form.page(params[:page_index]).per(params[:page_size])
          render json: forms, serializer: PaginatedFormSerializer, total_count: Form.count, status: :ok
        end
      end
      

      【讨论】:

        【解决方案5】:

        0.10active model serializer 开始,您可以通过instance_options 变量传递任意选项,如here 所示。

        # posts_controller.rb
        class PostsController < ApplicationController
          def dashboard
            render json: @post, user_id: 12
          end
        end
        
        # post_serializer.rb
        class PostSerializer < ActiveModel::Serializer
          attributes :id, :title, :body
          def comments_by_me
            Comments.where(user_id: instance_options[:user_id], post_id: object.id)
          end
        end
        

        【讨论】:

          【解决方案6】:

          serialization_options 适用于 Active Model Serialization 0.9.3。

          可以使用它们的键在序列化程序中访问与渲染命令一起传递的选项 -> serialization_options[:key]

          【讨论】:

            【解决方案7】:

            简单的方法是在事件序列化器中添加活动方法并返回 n 个活动。就是这样。

            class EventSerializer < ActiveModel::Serializer
            
              has_many :activities
            
              def activities
                object.activities[0..9] # Select whatever you want
              end
            end
            

            【讨论】:

            • 除非您硬编码了返回的活动。 'options' 哈希的全部意义在于 API 为端点的使用者提供不同的选项。
            猜你喜欢
            • 1970-01-01
            • 2016-10-03
            • 2019-07-25
            • 1970-01-01
            • 2021-06-20
            • 1970-01-01
            • 2016-10-28
            • 2012-10-14
            • 1970-01-01
            相关资源
            最近更新 更多