2 Stimmen

Erstellen von Rails-Modell aus verschachtelter JSON-Anfrage - AssociationTypeMismatch

Meine Anwendung hat die folgenden Model-Klassen:

class Parent < ActiveRecord::Base
    # Setup accessible (or protected) attributes for your model
    attr_accessible :child_attributes, :child

    has_one :child

    accepts_nested_attributes_for :child

    #This is to generate a full JSON graph when serializing
    def as_json(options = {})
        super(options.merge, :include => {:child => {:include => :grandchild } })
    end
end

class Child < ActiveRecord::Base
    # Setup accessible (or protected) attributes for your model
    attr_accessible :grandchild_attributes, :grandchild

    belongs_to :parent
    has_one :grandchild

    accepts_nested_attributes_for :grandchild
end

class Grandchild < ActiveRecord::Base
    belongs_to :child
end

Dann habe ich in meinem Controller eine create Methode definiert:

def create
     = Parent.new(params[:parent])
    #Rest ommited for brevity - just respond_with and save code
    end
end

Meine Anfrage erscheint in den Logs als:

Parameters: {"parent"=>{"child"=>{"grandchild"=>{"gc_attr1"=>"value1", "gc_attr2"=>"value2"}}, "p_attr1"=>"value1"}

Dies ist der vollständige Serialisierungsgraph, der von meiner iPhone-App-Clientanwendung mit RestKit stammt. Ich habe in anderen SO-Fragen wie hier gesehen, dass auf diesen Blog-Beitrag verwiesen wird. Mein Problem ist jedoch, dass ich nicht weiß, wie ich den serialisierten Graphen von der Clientseite aus mit RestKit steuern kann, um eine Anfrage wie diese zu erstellen (und auf diese Weise funktioniert es.. getestet mit Debugger)

Parameters: {"parent"=>{"child_attributes"=>{"grandchild_attributes"=>{"gc_attr1"=>"value1", "gc_attr2"=>"value2"}}, "p_attr1"=>"value1"}

Hat jemand Ideen, ob es eine Option gibt, die ich an die Parent.new-Methode übergeben oder die RestKit-JSON-Ausgabe anpassen kann, um die model_attributes-Struktur innerhalb von verschachtelten JSON-Objekten zu erreichen?

Danke

0voto

cvbarros Punkte 1664

Ich habe dieses Problem gelöst, indem ich RABL verwendet habe, was ein Gem ist, um JSON als Ansichten zu rendern. Tolle Arbeit. Das hat es mir ermöglicht, den Serialisierungsgraphen meines Modells anzupassen.

Auf der RestKit-Seite (unter Verwendung von OM2.0 - neues Objektmapping) habe ich alle meine Zuordnungen auf child_attributes für alle Beziehungen geändert, zum Beispiel:

RKObjectMapping* parentMapping = ... //Initialisiere hier deine Zuordnung
RKObjectMapping* childMapping = ... //Initialisiere hier deine Zuordnung

//Konfiguriere Zuordnungsbeziehung mit Kind
[parentMapping mapKeyPath:@"child_attributes" toRelationship:@"childProperty" withObjectMapping:childMapping];

//Registriere Zuordnungen
RKObjectManager* manager = [RKObjectManager sharedManager];
[manager.mappingProvider registerMapping:parentMapping withRootKeyPath:@"parent"];
[manager.mappingProvider registerMapping:childMapping withRootKeyPath="child"];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X