Сохранение вложенных объектов с помощью Rails, backbone.js и accepts_nested_attributes_for
Я использую Rails, backbone.js(изучая это сейчас). Скажем, у вас есть две модели: автомобиль и двигатель.
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()
Каков правильный способ отправки engine_attributes
на контроллер? (Car accepts_nested_attributes_for :engine
, поэтому он ожидает engine_attributes
.) Я переопределяю Backbone sync()
? Существует ли лучшее соглашение для вложенных моделей?
Возможно, мне не нужно возвращать вложенные модели из контроллера или возвращать engine_attributes
вместо engine
?
На стороне примечания я использую Rails respond_with(@car, :include => :engine)
(то же, что и @car.to_json(:include => :engine)
. Тот факт, что этот api устанавливает атрибуты движка в engine
, но модель ожидает engine_attributes
, кажется противоречивой - я никогда не был уверен, как смириться с этим.
Ответы
Ответ 1
Я бы предложил переопределить JSON на базовой модели.
toJSON: function(){
json = {car : this.attributes};
return _.extend(json, {engine_attributes: this.get("engine").toJSON());
}
toJSON вызывается внутри метода синхронизации непосредственно перед отправкой данных на сервер.
Ответ 2
Очень полезно. Я работал с аналогичной ситуацией, и этот пример сначала не сработал у меня. В моем примере у меня есть отношение has_many/belongs_to. Например, автомобиль has_many: шины.
Проблема, с которой я столкнулась, заключалась в том, что атрибуты tire_attributes должны были быть вложенными внутри автомобиля json, а не рядом с ним. У меня получилось что-то вроде этого:
toJSON: function(){
json = {car : this.attributes};
json.car.tires_attributes = this.get('tires').toJSON();
return json;
}
Надеюсь, что это поможет.
Ответ 3
Я нашел этот камень! Может быть, поможет вам.
http://blog.dtmtec.com.br/blog/2013/05/power-up-your-backbone-models-with-nested-attributes/
Ответ 4
Я считаю, что мы должны что-то делать с (или вокруг) Backbone sync
или с рельсами backend, потому что проблема в общении между двумя. Переопределение метода toJSON()
может привести к неожиданным результатам, поскольку это метод общего назначения и другие части приложения могут опираться, например, на представления.
Возможно быстрое решение:
redCar.save({}, {
contentType: 'application/json',
data: JSON.stringify({car: redCar.toJSON(), engines_attributes: redCar.get('engines').toJSON()})
});