如何将参数传递给ActiveModel序列化程序

Bru*_*Lin 63 ruby-on-rails active-model-serializers

我正在使用主动模型序列化器.我有一个有很多活动的模特活动.

我想用前n个活动返回事件.我想我应该将params n传递给事件序列化器.

Eri*_*oss 95

~> 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
Run Code Online (Sandbox Code Playgroud)


Log*_*man 43

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

respond_with @event, activity_count: 5
Run Code Online (Sandbox Code Playgroud)

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

  • `@ options`似乎对我不起作用,事实证明哈希改为`@instance_options`而不是.这样做对我来说. (19认同)
  • 从AMS 0.9.0开始,这不起作用.由于AMS没有文档,没有wiki,也没有讨论板,因此目前这似乎是一个死胡同. (6认同)
  • 它在0.8分支上,而不是在主分支上.https://github.com/rails-api/active_model_serializers/tree/0-8-stable我们真的需要这个.https://github.com/rails-api/active_model_serializers/issues/599 (4认同)
  • 如果可以的话,更安全地使用0.8版本,因为它是由AMS团队推荐的.`我们建议你开始的任何新项目都使用这个gem的最新0.8.x版本.这个版本使用最广泛,最接近即将发布的版本 (2认同)

Jon*_*old 38

所述@options散列除去在0.9; 看起来像是一个等效的方法最近添加 -

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

class ModelSerializer::ActiveModel::Serializer
  def some_method
    puts serialization_options[:option_name]
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 我有宝石版0.9(更新它只是为了确定)但选项和serialization_options都不起作用.这是错误未定义的局部变量或方法`serialization_options' (4认同)
  • `serialization_options`在0.9.3中运行良好. (2认同)

win*_*ong 12

使用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
Run Code Online (Sandbox Code Playgroud)


jub*_*ess 9

作为0.10主动型串行器,你可以通过传递任意选择instance_options所看到的变量在这里.

# 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
Run Code Online (Sandbox Code Playgroud)


Pus*_*abh 8

serialization_options适用于Active Model Serialization 0.9.3.

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