Übergeben von Parametern an ActiveModel Serializer


Antworten:


47

Übergebene Optionen sind über den @optionsHash verfügbar . Wenn Sie dies tun:

respond_with @event, activity_count: 5

Sie können @options[:activity_count]innerhalb des Serializers verwenden.


7
Ab AMS 0.9.0 funktioniert dies nicht mehr. Da AMS keine Dokumentation, kein Wiki und keine Diskussionsforen hat, scheint dies derzeit eine Sackgasse zu sein.
Robin Daugherty

1
Das scheint nicht zu funktionieren. Wo ist die Dokumentation dazu?
David


2
Verwenden Sie die Version 0.8 sicherer, wenn Sie können, da dies vom AMS-Team empfohlen wird. 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.
Bigtex777

21
@optionsschien nicht für mich zu funktionieren, es stellte sich heraus, dass der Hash @instance_optionsstattdessen geändert wurde . Das hat es für mich getan.
the_critic

110

In der Version müssen ~> 0.10.0Sie verwenden @instance_options. Verwenden Sie das @ Jon Gold-Beispiel von oben:

# 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

Ich kann das nicht zum Laufen
bringen

42

Der @optionsHash wurde entfernt 0.9; sieht aus wie eine äquivalente Methode wurde kürzlich hinzugefügt -

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

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

4
Ich habe die Gem-Version 0.9 (aktualisiert, um sicherzugehen), aber sowohl die Optionen als auch die serialization_options funktionieren nicht. Dies ist der Fehler undefinierte lokale Variable oder Methode `serialization_options '
Ganeshran

1
Ganeshran ist richtig. serialization_optionssollte auf 0.9 funktionieren, aber es scheint, als würde man 0.8 verwenden und @optionsist der einzige Weg, der im Moment funktioniert.
jmosesman

12

Mit 0.9.3 können Sie #serialization_options wie folgt verwenden ...

# 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

9

Ab 0.10dem aktiven Modell Serializer können Sie beliebige Optionen über den Pass instance_optionsVariable wie gesehen hier .

# 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

8

serialization_options funktioniert gut mit Active Model Serialization 0.9.3.

Auf die mit dem Befehl render übergebenen Optionen kann im Serializer mit ihren Schlüsseln zugegriffen werden -> serialization_options [: key]


-2

Ein einfacher Weg ist, einfach die Aktivitätsmethode im Ereignisserialisierer hinzuzufügen und n Aktivitäten zurückzugeben. Das ist es.

class EventSerializer < ActiveModel::Serializer

  has_many :activities

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

1
Außer Sie haben fest codiert, welche Aktivitäten zurückgegeben werden. Der gesamte Punkt des 'Options'-Hashs besteht darin, dass die API dem Verbraucher eines Endpunkts verschiedene Optionen zur Verfügung stellt.
rmcsharry
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.