2014-11-05 10 views
9

Ich bin Rails-Api-Edelstein in meinem Projekt für JSON API, und für diesen Zweck habe ich aktiven Modell Serializer Gem zum Serialisieren meiner Objekte, aber einige, wie die Objekte nicht serialisiert werden Verwenden des aktiven Modell-Serialisierers.aktive Modell Serializer nicht mit Rails-Api Edelstein

Ich habe eine MessageSerializer Innenseite meiner Serializer Ordner

class MessageSerializer < ActiveModel::Serializer 
    attributes :id, :sender_id, :recipient_id, :sender_type, :subj, :body, :status, :sender 

    def sender 
    object.user.try('username') 
    end 
end 

Und meine Nachrichten-Controller ist wie

folgt
class Api::MessagesController < Api::BaseController 

    def index 
    @messages = current_user.incoming_messages 
    render json: @messages, serializer: MessageSerializer 
    end 

end 

Aber das Problem ist, dass das serialisierte Objekt Client geworfen enthält alle Felder in Nachrichtenmodell dh; Es enthält auch created_at, updated_at Felder.

Scheint wie es nicht Serializer verwenden.

Was könnte schief gegangen sein? Ich habe viel darüber gesucht, aber keinen Beitrag gefunden, der mir geholfen hat.

Danke

+0

diese Änderung 'Klasse Api :: MessagesController Gowri

+0

Nein, nicht gut. Die Api :: BaseController-Klasse erbt die ApplicaionController-Klasse. Also im Grunde ist es das Gleiche. – Gagan

Antwort

15

In Ihrer Base, haben fügen Sie die unten sind?

include ActionController::Serialization

+1

das ist die richtige Lösung. Reduziere niemals den Edelstein. – seoyoochan

10

Welche Version von AMS verwenden Sie?

Ich hatte das gleiche Problem und konnte es beheben, indem ich die AMS-Version von 0.9.X zu 0.8.X änderte. Dies kann durch Hinzufügen einer Versionsnummer zu Ihrer Gemdatei erfolgen.

gem 'active_model_serializers', '~> 0.8.0' 

Es gibt Hinweise dazu auf dem AMS GitHub Repo.

https://github.com/rails-api/active_model_serializers#maintenance-please-read

+0

Danke! Hätte Stunden vergeudet, bevor ich das erkannt habe! –

1

ich Herabstufung nicht, verbrachte ich einige Zeit verschiedene Dinge versucht und am Ende ich zu einem Muster wie diese:

def sender 
    if object.sender 
    serializer = SenderSerializer.new(object.sender) 
    ActiveModel::Serializer::Adapter::JsonApi.new(serializer).as_json[:senders] 
    end 
end 

es ist hässlich, aber es hat den Trick für mich .

Für eine has_many Beziehung, Sie so etwas tun kann:

def attachments 
    attachments = object.attachments.to_a 
    return [] if attachments.empty? 
    serializer = ActiveModel::Serializer::ArraySerializer.new(attachments, each_serializer:AttachmentSerializer) 
    ActiveModel::Serializer::Adapter::JsonApi.new(serializer).as_json[:attachments] 
end 
5

Das ist, weil die Serialisierung nicht standardmäßig in Schienen-api geladen wird.
Sie haben, dies zu tun:

class ApplicationController < ActionController::API 
    include ::ActionController::Serialization 
end 
+0

Das ändert nichts für mich. Irgendwelche anderen Ideen? – panzi