Подтвердить что ты не робот

Сохранение вложенных объектов с помощью 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, кажется противоречивой - я никогда не был уверен, как смириться с этим.

4b9b3361

Ответ 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;

}

Надеюсь, что это поможет.

Ответ 4

Я считаю, что мы должны что-то делать с (или вокруг) Backbone sync или с рельсами backend, потому что проблема в общении между двумя. Переопределение метода toJSON() может привести к неожиданным результатам, поскольку это метод общего назначения и другие части приложения могут опираться, например, на представления.

Возможно быстрое решение:

redCar.save({}, {
    contentType: 'application/json',
    data: JSON.stringify({car: redCar.toJSON(), engines_attributes: redCar.get('engines').toJSON()})
});