如何向ActiveModel序列化器传递参数

75
我正在使用 active model serializer。我有一个事件模型,其中有许多活动。
我希望返回包含前n个活动的事件。我认为应该将参数n传递给事件序列化程序。
7个回答

117

在版本~> 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

52

通过@options哈希表可用传递的选项。如果您执行:

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

7
截至 AMS 0.9.0 版本,这个方法已经不可用。由于 AMS 没有文档、维基和讨论版块,目前看来这似乎是一个死胡同。 - Robin Daugherty
1
这似乎不起作用。这个的文档在哪里? - David
4
它在0.8分支上,而不是主分支。https://github.com/rails-api/active_model_serializers/tree/0-8-stable 我们真的需要这个。https://github.com/rails-api/active_model_serializers/issues/599 - kenn
3
如果可以的话,建议使用AMS团队推荐的0.8版本,因为我们建议任何新项目都使用这个宝石的最新0.8.x版本。该版本是最广泛使用的,并且最接近即将发布的版本。 - bigtex777
27
对我来说,@options 似乎没有起作用,结果发现哈希改为 @instance_options。这对我有用。 - the_critic
显示剩余2条评论

46

@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

4
我有0.9版本的gem(为确保更新了它),但选项和serialization_options都无法使用。这是错误信息:未定义本地变量或方法“serialization_options”。 - ganeshran
1
ganeshran 是正确的。serialization_options 应该可以在 0.9 版本上使用,但目前看来使用 0.8 和 @options 是唯一可行的办法。 - jmosesman

15

active model serializer0.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

0.10 是 Rails 的版本吗? - duhaime

14

使用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

8

serialization_options 与Active Model Serialization 0.9.3兼容。

使用render命令传递的选项可以通过其键在序列化器中访问 -> serialization_options [:key]


-3

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

class EventSerializer < ActiveModel::Serializer

  has_many :activities

  def activities
    object.activities[0..9] # Select whatever you want
  end
end

2
除非您已经硬编码了要返回哪些活动,否则“选项”哈希的整个目的是为API提供不同的选项,以便端点的使用者可以选择。 - rmcsharry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接