ruby on rails - form_with - Guardar objetos anidados con Rails, backbone.js y accept_nested_attributes_for
text_field rails (4)
Estoy usando Rails, backbone.js (aprendiendo esto ahora). Digamos que tienes dos modelos, Coche y Motor.
var Car = Backbone.Model.extend({
initialize: function() {
if(this.get(''engine'') != undefined) this.engine = new Engine(this.get(''engine''));
}
}
var redCar = new Car({
''color'': ''red'',
// The controller nests the model
''engine'': {
''horsepower'': ''350''
}
});
redCar.save()
¿Cuál es la forma correcta de enviar engine_attributes
del engine_attributes
al controlador? (El coche accepts_nested_attributes_for :engine
, por lo que espera los engine_attributes
.) ¿ engine_attributes
la sync()
engine_attributes
troncal sync()
? ¿Hay una mejor convención a seguir para los modelos anidados?
Tal vez no debería devolver modelos anidados desde el controlador, o devolver engine_attributes
lugar de engine
?
En una nota al margen, estoy usando Rails respond_with(@car, :include => :engine)
(igual que @car.to_json(:include => :engine)
. El hecho de que esta aplicación anida los atributos del engine
en el engine
pero el modelo espera que engine_attributes
parezca contradictorio; nunca he estado seguro de cómo conciliar esto.
¡Encontré esta joya! Quizás te ayude
http://blog.dtmtec.com.br/blog/2013/05/power-up-your-backbone-models-with-nested-attributes/
Creo que tenemos que hacer algo con (o alrededor) de sync
Backbone o con backend de raíles, porque el problema en la comunicación entre dos. Anular el toJSON()
podría generar resultados inesperados, ya que este es un método de propósito general y otras partes de la aplicación pueden basarse, por ejemplo, en las vistas.
Posiblemente una solución rápida:
redCar.save({}, {
contentType: ''application/json'',
data: JSON.stringify({car: redCar.toJSON(), engines_attributes: redCar.get(''engines'').toJSON()})
});
Muy útil. Estaba trabajando con una situación similar, y este ejemplo no funcionó para mí al principio. En mi ejemplo, tengo una relación has_many / belongs_to. Por ejemplo, un automóvil tiene_mucho: neumáticos.
El problema que encontré fue que los atributos de los neumáticos debían anidarse DENTRO del automóvil json, no adyacente a él. Terminé con algo como esto:
toJSON: function(){
json = {car : this.attributes};
json.car.tires_attributes = this.get(''tires'').toJSON();
return json;
}
Espero que esto ayude.
Yo sugeriría anular a JSON en el modelo de red troncal.
toJSON: function(){
json = {car : this.attributes};
return _.extend(json, {engine_attributes: this.get("engine").toJSON());
}
toJSON se llama dentro del método de sincronización justo antes de enviar datos al back-end.