Estoy escribiendo una práctica de la aplicación Backbone, con la API de back-end de Rails, y estoy confundido acerca del comportamiento de guardar en modelos Backbone.¿Por qué el modelo Backbone está enviando atributos duplicados al servidor al guardar?
Digamos que un equipo tiene muchos jugadores, y quiero guardar un equipo con numerosos jugadores en un solo POST.
Así que en los carriles tengo:
class Team < ActiveRecord::Base
has_many :players
accepts_nested_attributes_for :players
end
class Player < ActiveRecod::Base
belongs_to :team
end
y para el cliente de la columna vertebral, tengo un modelo de jugador y una colección de jugadores definido (no se muestra)
y luego el modelo de equipo que contiene (NOTA: no colección de equipos)
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;
}
}
Cuando examino mi stringified JSON en el navegador, todo se ve bien:
{"team_size":12, "players_attributes":[{"name":"Fred"},{"name":"Jim" },{"name":"Mark"}]}
Al verificar los registros del servidor, se repite el atributo de nivel superior solitario ('tamaño del equipo'), una vez en el nivel superior y luego se repite bajo una clave raíz.
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}
}
Tengo algunas preguntas:
¿Cuál es la mejor manera de asegurar los player_attributes están anidadas dentro de la clave raíz? I (Para que pueda hacer un guardado anidado dentro de TeamController, en la forma estándar de rieles: (es decir Team.create (params [: team])) Puedo lograr esto con algunos hackes de javascript dentro de JSON, pero supongo que hay una . manera más fácil, más limpio
¿es esta norma, el comportamiento deseable? Para enviar los duplicados de los atributos de este tipo? Creo que no hay ningún daño, pero no huele bien.
no soy yo definición de la URL/UrlRoot correctamente o algunas de estas?
gracias
Backbone envía exactamente el resultado de toJSON(): 'params.data = JSON.stringify (model.toJSON());', por lo que su modelo contiene tales atributos o algo extraño en el servidor (hay un parche de cierre de desperdicios en el registro). Verifique el contenido de la solicitud http en firebug para averiguar a quién culpar. – Yaroslav
He tenido este mismo problema con Backbone and Rails por un tiempo ... ahora necesito optimizar y esto se está volviendo desagradable ... ¿Alguna idea de dónde viene? – wulftone
Creo que vale la pena señalar que en mi caso (y probablemente también en el suyo), la red troncal parece estar enviando información no duplicada. Firebug me dice que la solicitud POST enviada a mi servidor contenía la información correcta y no duplicada. Sin embargo, en algún lugar antes de que se convierta en el rubí "params", se duplican algunas cosas ... ¿por qué? – wulftone