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.