Warum sendet das Backbone-Modell beim Speichern doppelte Attribute an den Server?

9

Ich schreibe eine praktische Backbone-App mit der Rails-Backend-API und ich bin verwirrt über das Verhalten beim Speichern von Backbone-Modellen.

Nehmen wir an, ein Team hat viele Spieler und ich möchte ein Team mit zahlreichen Spielern in einem einzigen POST speichern.

Also in Rails habe ich:

%Vor%

und für den Backbone-Client habe ich ein Player-Modell und eine Players-Sammlung definiert (nicht gezeigt)

und dann das enthaltende Team-Modell (HINWEIS: keine Teams-Sammlung)

%Vor%

Wenn ich meinen stringifizierten JSON im Browser untersuche, sieht alles gut aus:

%Vor%

Bei der Überprüfung der Serverprotokolle wird das einzige Top-Level-Attribut ("Teamgröße") einmal auf der obersten Ebene wiederholt und dann unter einem Stammschlüssel wiederholt.

%Vor%

Ich habe ein paar Fragen:

  1. Was ist der beste Weg, um sicherzustellen, dass die player_attributes innerhalb des Root-Schlüssels verschachtelt sind? Ich (damit ich eine verschachtelte Sicherung in TeamController, in der Standard-Rails-Art machen kann: (zB Team.create (params [: team])) kann ich dies mit einigen Javascript-Hackereien innerhalb von jSON erreichen, aber ich schätze, da ist ein einfacher, sauberer Weg.

  2. Ist das ein Standard, wünschenswertes Verhalten? Um Duplikate von Attributen wie diesem zu senden? Ich schätze, es gibt keinen Schaden, aber es riecht nicht richtig.

  3. Definiere ich die url / urlRoot nicht korrekt oder so?

Danke

    
doublea 07.06.2012, 17:49
quelle

3 Antworten

3

1- Sie müssen die toJSON-Methode überschreiben, um den Modellnamen als Wurzel des JSON-Elements anzugeben, das an den Server gesendet wird.

%Vor%

Da Sie diese Methode bereits verwirren und übersteuern, sehe ich keinen Grund, nicht auf diesen Weg zu gehen.

2- Das ist ein sehr merkwürdiges Verhalten, das du beschreibst. Probieren Sie:

%Vor%

Es wird wahrscheinlich das Parsing von Parsern von doppelten Params eliminieren. Ein weiterer Vorteil, den Sie daraus ziehen können, ist, dass Rails das Team nicht als Root-Element seines generierten JSON zum Client hinzufügen wird.

3- Ihre Definition von urlRoot ist in Ordnung.

    
Erez Rabih 22.09.2012, 07:00
quelle
0

Ich bin hier angekommen, als ich nach dem gleichen Thema gesucht habe. Selbst wenn es eine alte Frage ist, denke ich, dass es sich lohnt, die Antwort zu geben.

Ich habe tatsächlich eine Rails-Einstellung gefunden, die diese doppelten Attribute erklärt: wrap_parameters

Ссылка

Stellen Sie es einfach auf ein leeres Array ein und Rails versuchen nicht, die Parameter, die von Ihren JSON-Anfragen kommen, zu umbrechen.

    
gonzoyumo 27.09.2013 22:27
quelle
0

Obwohl Sie den von anderen erwähnten toJSON-Hack verwenden können, ist das eigentlich keine so gute Idee. Zum einen erzeugt es ein inkonsistentes Ergebnis zwischen sync und save mit {patch: true} (diese Inkonsistenz liegt daran, dass die sync-Methode toJSON aufruft, wenn Sie nicht patchen, aber nicht toJSON aufrufen, wenn patch auf true gesetzt ist )

Stattdessen ist es besser, eine gepatchte Version von Backbone zu verwenden, die die Synchronisierungsmethode selbst überlastet. Das Backbone-Rails-Juwel führt dies automatisch aus, oder du kannst backbone_rails_sync.js in deine eigene App ziehen. Eine vollständigere Antwort auf diese Frage finden Sie hier: Backbone.js und Rails - Wie mit Params von Backbone-Modellen umzugehen?

    
Jason FB 19.05.2016 16:39
quelle