web-dev-qa-db-fra.com

Comment passer des paramètres à un sérialiseur ActiveModel

J'utilise sérialiseur de modèle actif . J'ai un événement modèle qui comporte de nombreuses activités.

Je veux rendre l'événement avec les n premières activités. Je pense que je devrais passer les paramètres n au sérialiseur d’événements.

63
Bruce Xinda Lin

Les options passées sont disponibles via le @options hash. Donc si vous le faites:

respond_with @event, activity_count: 5

Vous pouvez utiliser @options[:activity_count] dans le sérialiseur.

42
Logan Serman

En version ~> 0.10.0 vous devez utiliser @instance_options. En utilisant l'exemple de @Jon Gold depuis le haut

# 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
93
Eric Norcross

Le @options Le hachage a été supprimé dans 0.9; ressemble à une méthode équivalente était récemment ajouté -

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

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

Avec 0.9.3, vous pouvez utiliser #serialization_options comme suit ...

# 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
11
wintondeshong

À partir de 0.10 de sérialiseur de modèle actif vous pouvez passer des options arbitraires via le instance_options variable telle que vue ici .

# 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
9
jubeless

serialization_options fonctionne bien avec la sérialisation de modèle actif 0.9.3.

Les options passées avec la commande de rendu sont accessibles dans le sérialiseur à l'aide de leurs clés -> serialization_options [: key]

8
Pushp Raj Saurabh