Serialisiert ein array von Modellen mit Hilfe von active_model_serializers
Ich versuche zu senden, die die serialisierte version eines Modells, um eine Ansicht als param, mit der gem active_model_serializers
#app/serializers/admin_serializer.rb
class AdminSerializer < ActiveModel::Serializer
attributes :id, :email, :access_locked?
end
#app/controllers/dashboard/admins_controller.rb
def index
@search = Admin.search(params[:q])
@admins = @search.result(:distinct => true).page(params[:page]).per(10)
@page_entries_info = view_context.page_entries_info @admins
# render json: @admins
respond_to do |format|
format.html
format.js
format.json {render json: @admins}
end
end
#app/views/dashboard/admins/index.html.erb
<%= debug (ActiveModel::Serializer::Adapter.adapter_class(:json_api).new(ActiveModel::Serializer.serializer_for(@admins.first).new(@admins.first),{}).to_json) %>
<%= debug (@admins.all.map{|admin| AdminSerializer.new(admin).to_json}) %>
Oben debuggt werden, woraus sich die unten Antwort:
--- '{"data":{"id":"1","type":"admins","attributes":{"email":"[email protected]","access_locked?":false}}}' //returned by the first debug
---
- '{"object":{"id":36,"email":"[email protected]","created_at":"2016-03-28T05:15:17.546Z","updated_at":"2016-03-28T05:15:17.546Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":20,"email":"[email protected]","created_at":"2016-03-28T05:15:16.304Z","updated_at":"2016-03-28T05:15:16.304Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":22,"email":"[email protected]","created_at":"2016-03-28T05:15:16.459Z","updated_at":"2016-03-28T05:15:16.459Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":37,"email":"[email protected]","created_at":"2016-03-28T05:15:17.624Z","updated_at":"2016-03-28T05:15:17.624Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":5,"email":"[email protected]","created_at":"2016-03-28T05:15:15.139Z","updated_at":"2016-03-28T05:15:15.139Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":14,"email":"[email protected]","created_at":"2016-03-28T05:15:15.838Z","updated_at":"2016-03-28T05:15:15.838Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":27,"email":"[email protected]","created_at":"2016-03-28T05:15:16.848Z","updated_at":"2016-03-28T05:15:16.848Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":2,"email":"[email protected]","created_at":"2016-03-28T05:15:14.873Z","updated_at":"2016-03-28T05:15:14.873Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":10,"email":"[email protected]","created_at":"2016-03-28T05:15:15.527Z","updated_at":"2016-03-28T05:15:15.527Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":15,"email":"[email protected]","created_at":"2016-03-28T05:15:15.916Z","updated_at":"2016-03-28T05:15:15.916Z"},"instance_options":{},"root":null,"scope":null}'
In der ersten debug-ich bin serialisieren nur ein Objekt, während in der zweiten eine, die ich versuche zu tun, es für ein array von Objekten.
Die erste debug ist richtig, Rücksendung der serialisierte version des Objekts(in json_api-format), während der zweite debug nicht.
Versucht ArraySerializer als auch mit keinen Erfolg: ActiveModel::Serializer::ArraySerializer.new(@admins, each_serializer: AdminSerializer).as_json
wie kann ich erreichen der gewünschten Serialisierung. Außerdem, wenn es gelingt, kann ich einige andere vereinfachte version dieser? Wie diese debug Anweisung wird viel zu ausführlich.
Habe versucht, alle Lösungen, die hier erwähnt - Wie wollen Sie die Initialisierung der ActiveModel::Serializer-Klasse mit ein ActiveRecord::Relation-array?
Das grundlegende problem, welches ich versuche zu lösen ist, in der index-Methode der Admin-controller, der Admin-Objekt übergeben, als PORO um die index.html Datei. Aber ich will das serialisierte json-version dieses Objekts, so dass ich übergeben es an meinen Komponenten reagieren als requisite
index-Methode rendert die richtige json auf brennen http://dashboard.localhost.com:3000/admins.json
UPDATE#1 für die index-Methode
def index
@search = Admin.search(params[:q])
@admins_array = @search.result(:distinct => true).to_a
if params[:page]
@admins = @search.result(:distinct => true).page(params[:page][:number]).per(10)
@admins_json_array = Kaminari.paginate_array(@admins_array).page(params[:page][:number]).per(10)
else
@admins = @search.result(:distinct => true).page(1).per(10)
@admins_json_array = Kaminari.paginate_array(@admins_array).page(1).per(10)
end
@admins_json = ActiveModel::SerializableResource.new(@admins_json_array.to_a)
...
...
...
end
- Sie haben ein repo könnte ich Klonen und versuchen, diese in?
- Nein, ich kann das nicht tun. Nicht privilegiert genug
- Machen Sie ein kleines repository mit gerade genug code, um das problem reproduzieren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich einen controller, den ich brauche, um geben Sie den serializer in aufgrund wollen verschiedenen Attributen aus dem Standard-serializer.
Controller:
So, nur um die Dinge zu arbeiten, was passiert, wenn Sie angeben, die
each_serializer
option?Bearbeitet:
Außerhalb Controller:
Beachten Sie, dass ohne Angabe
each_serializer
,SerializableResource
möchten, verwenden Sie dieUserSerializer
.Edit #2,
Sieht es aus wie es ist etwas seltsames passiert mit den @admins Daten.
Versuchen Umwandlung in ein array:
Edit #3
Umbrechen array, versuchen Sie Folgendes:
ActiveModel::SerializableResource.new(User.first(2)).to_json
<%= debug(ActiveModel::SerializableResource.new(@admins.first(2)).to_json) %>
funktioniert bei mir auch.. aber leider<%= debug(ActiveModel::SerializableResource.new(@admins).to_json) %>
nicht. führt zuundefined method
query_parameters' for nil:NilClass`@admins
ist einige seltsame Objekt... was passiert, wenn Sie tack auf eine.to_a
zu admins, so@admins.to_a
. Auch könnten Sie die Ausgabe von@admins.class.name
?to_a
lösen Sie Ihr problem jetzt?ActiveModel::SerializableResource.new(@admins.to_a).to_json
Arbeit aus?<%= debug(ActiveModel::SerializableResource.new(@admins.to_a).to_json) %>
@paginated_array = Kaminari.paginate_array(@your_array).page(3).per(1)
?ActiveModel::SerializableResource
worden ist veraltet, zu Gunsten derActiveModelSerializers::SerializableResource
Folgen Sie der Anleitung: Serialisieren, bevor controller Rendern
Könnten Sie
ActiveModel::SerializableResource.new(@admins, adapter: :json_api).to_json
in
index.html.erb
unten ist die Ausgabe(mit posts)
undefined method query_parameters for nil:NilClass
github.com/rails-api/active_model_serializers/issues/1268@posts
was ist array von Post-Instanzen. Könnte Sie drucken, was Sie in Ihrer@admins
für weiter Debuggen?