Ich schreibe eine Übung Backbone-App, mit Rails Backend-API, und ich bin verwirrt über das Verhalten von Speichern auf Backbone-Modelle.Warum sendet das Backbone-Modell beim Speichern doppelte Attribute an den Server?
Nehmen wir an, ein Team hat viele Spieler, und ich möchte ein Team mit zahlreichen Spielern in einem einzigen POST speichern.
So in Rails Ich habe:
class Team < ActiveRecord::Base
has_many :players
accepts_nested_attributes_for :players
end
class Player < ActiveRecod::Base
belongs_to :team
end
und für Backbone-Client, ich habe ein Spieler Modell und einen Spieler Sammlung definiert (nicht dargestellt)
und dann das enthält Team Modell (HINWEIS: nein Teams Sammlung)
Demo.Models.Team = Backbone.Model.extend({
urlRoot: '/teams',
defaults: {
'team_size': 12
},
initialize: function() {
this.players = new Demo.Collections.Players());
},
toJSON: function() {
var json = _.clone(this.attributes);
json.players_attributes = this.players.map(function(player) {
return player.toJSON();
});
return json;
}
}
Wenn ich meine Zeichenfolge JSON im Browser prüfen, alles sieht gut aus:
{"team_size":12, "players_attributes":[{"name":"Fred"},{"name":"Jim" },{"name":"Mark"}]}
Bei der Überprüfung der Serverprotokolle wird das einzige oberste Attribut ("Teamgröße") einmal auf der obersten Ebene wiederholt und dann unter einem Stammschlüssel wiederholt.
Started POST "/teams" for 127.0.0.1 at 2012-06-07 13:39:40 -0400
Processing by TeamsController#create as JSON
Parameters: {
"team_size"=>12, "players_attributes":[{"name":"Fred"},{"name":"Jim" },{"name":"Mark"}]},
"team"=>{"team_size"=>12}
}
Ich habe ein paar Fragen:
Was ist der beste Weg, um das player_attributes verschachtelt sind im Innern des Wurzelschlüssels zu gewährleisten? 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 vermute, da ist ein einfacher, sauberer Weg.
ist das Standard, erwünschtes Verhalten? Um Duplikate von Attributen wie diese zu schicken? ich denke, kein Schaden da ist, aber es richtig stinkt nicht.
bin ich die uRL nicht definiert,/UrlRoot richtig oder so?
dank
Backbone sendet genau das Ergebnis von toJSON(): 'params.data = JSON.stringify (model.toJSON());', also entweder Ihr Modell enthält solche Attribute oder etwas Seltsames auf dem Server (es gibt eine überflüssige schließende Klammer im Protokoll). Überprüfen Sie den Inhalt der HTTP-Anfrage in Firebug, um herauszufinden, wen Sie dafür verantwortlich machen können. – Yaroslav
Ich hatte das gleiche Problem mit Backbone und Rails für eine Weile ... jetzt muss ich optimieren und das wird unausstehlich ... irgendeine Idee, woher es kommt? – wulftone
Ich denke, es ist erwähnenswert, dass in meinem Fall (und wahrscheinlich auch bei Ihnen) das Backbone anscheinend nicht-duplizierte Informationen sendet. Firebug sagt mir, dass die POST-Anfrage, die an meinen Server geschickt wurde, die korrekten, nicht-duplizierten Informationen enthielt. Irgendwo, bevor es zu den Rubin "Params" kommt, kopiert es einige Sachen ... warum? – wulftone