7

In einer Ruby 2/Rails 4 app versuche ich Acts-als-Taggable-on in Verbindung mit Active_Model_Serializers zu verwenden, um ein JSON zu erstellen API, die meine Tags zusammen mit anderen Modellparametern ausgeben würde.Fehler beim Laden von JSON für act-as-taggable-Tags mit Active-Model-Serializern

Zuerst einige Hintergrund/Motivation für dieses Problem: Die JSON wird in ember/ember-Daten, die zum Zeitpunkt dieses Schreibens hat die Unterstützung für eingebettete Datensätze in JSON entfernt. Es gibt eine vermeintliche Behebung in der documentation darüber, aber ich finde es ungeschickt und habe es auch nicht wirklich zur Arbeit gebracht. Da ich ein Ember-Neuling bin und ein wenig mehr mit Rails vertraut bin, denke ich, dass ich versuchen werde, das Problem auf eine andere Art und Weise zu lösen, indem ich den Tag-Datensatz neben den Dokumenten-Datensatz lade. Ich mag diese Lösung besser, weil sie für meine Anwendung sinnvoller ist, aber ich kann das auch nicht funktionieren.

Hier ist ein Beispiel: Nehmen wir an, ich ein Dokument Modell, das wirkt-as-markierbare-on verwendet:

class Document < ActiveRecord::Base 
    acts_as_taggable 
    # other code omitted 

Ich habe die Datenbank mit einem Dokument mit einem Tag aufgebaut. Nun betrachten wir die folgenden Fälle:

1. Volles Objekt eingefügt: Mit dem folgenden Serializer:

class DocumentSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :tags 

Meine JSON hat folgendes Format (mit Rails 4 UUID):

{ 
    "documents": [ 
    { 
     "id": "c41460fa-2427-11e3-8702-0800270f33f4", 
     "tags": [ 
     { 
      "id": "a33fc396-2428-11e3-8eeb-0800270f33f4", 
      "name": "test" 
     } 
     ] 
    } 
    ] 
} 

2. ID Einbetten: Verwenden des Serialisierers

class DocumentSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :tags, embed: :id 
jetzt

Meine JSON wie folgt aussieht:

{ 
    "documents": [ 
    { 
     "id": "c41460fa-2427-11e3-8702-0800270f33f4", 
     "tag_ids": [ 
     "a33fc396-2428-11e3-8eeb-0800270f33f4" 
     ] 
    } 
    ] 
} 

3. ID Einbetten mit Tags Sideload: Nach active_model_serializers Dokumentation, sollte ich in der Lage sein

class DocumentSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :tags, embed: :id, include: true 

zu tun, aber das funktioniert nicht . Stattdessen erhalte ich eine NoMethodError:

undefined method `object' for #<ActsAsTaggableOn::Tag:0x007f258cf1db38> 

Ich habe versucht, für dieses Problem gesucht, aber habe nichts nützlich bisher gefunden. Ich konnte auch keine Dokumentation zu beiden Edelsteinen finden, die sich auf den anderen Edelstein beziehen. Mein Verdacht im Moment, dass es etwas damit zu tun hat, wie Acts-als-Taggable-On implementiert ist, dass es keine direkte has_many-Beziehung ist? Kann irgendjemand etwas zu diesem Thema beitragen? Danke im Voraus!

+0

Kann ich dich fragen, wie Beziehungen zu handhaben mit glut? Wie können Sie ein Dokument zum Dokument hinzufügen? CreateRecord? –

Antwort

11

Behoben! Stellt sich heraus, um die Tags zu laden, muss der entsprechende Serializer definiert werden. Ich wusste das nicht, weil die Dokumentation zu implizieren scheint, dass ein Serializer optional ist und einige Standardeinstellungen in Abwesenheit eines verwendet werden. Offensichtlich ist dies nicht der Fall, wenn Sie die Option include: true verwenden möchten. Schlüssel in Sicht kam von here, vielen Dank!

Der Vollständigkeit halber zeige ich, was ich getan habe.Ich habe tag_serializer.rb mit dem folgenden Code:

module ActsAsTaggableOn 
    class TagSerializer < ActiveModel::Serializer 
    attributes :id, :name 
    end 
end 

und jetzt meine JSON:

{ 
    "tags": [ 
     { 
     "id": "a33fc396-2428-11e3-8eeb-0800270f33f4", 
     "name": "test" 
     } 
    ], 
    "documents": [ 
     { 
     "id": "c41460fa-2427-11e3-8702-0800270f33f4", 
     "tag_ids": [ 
      "a33fc396-2428-11e3-8eeb-0800270f33f4" 
     ] 
     } 
    ] 
} 
+1

auch, sicher sein, 'tag_serializer.rb' in' app/serializers/acts_as_taggable_on/tag_serializer.rb' zu speichern, damit Rails es automatisch laden kann – davekaro

+0

Es funktioniert für mich, aber ich muss dieses Modul ActsAsTaggableOn entfernen – icemelt