text_field rails form_with form_for ruby-on-rails backbone.js

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.



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.