Сохранение вложенных объектов с помощью Rails, backbone.js и acceptpts_nested_attributes_for - PullRequest
23 голосов
/ 08 марта 2011

Я использую 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 на контроллер? (Автомобиль accepts_nested_attributes_for :engine, поэтому он ожидает engine_attributes.) Должен ли я переопределить магистраль sync()? Есть ли лучшее соглашение для вложенных моделей?

Может быть, мне не следует возвращать вложенные модели из контроллера или возвращать engine_attributes вместо engine?

С другой стороны, я использую Rails respond_with(@car, :include => :engine) (то же самое, что и @car.to_json(:include => :engine). Тот факт, что этот атрибут относится к атрибутам движка в engine, но модель ожидает, что engine_attributes кажется противоречивым - я никогда был уверен, как это смириться.

Ответы [ 4 ]

33 голосов
/ 08 марта 2011

Я бы предложил переопределить toJSON в базовой модели.

toJSON: function(){

  json = {car : this.attributes};
  return _.extend(json, {engine_attributes: this.get("engine").toJSON());

}

toJSON вызывается в методе синхронизации непосредственно перед отправкой данных в бэкэнд.

2 голосов
/ 22 мая 2013

Я нашел этот драгоценный камень! Может быть, поможет вам.

http://blog.dtmtec.com.br/blog/2013/05/power-up-your-backbone-models-with-nested-attributes/

2 голосов
/ 05 апреля 2011

Очень полезно. Я работал с подобной ситуацией, и этот пример сначала не работал для меня. В моем примере у меня есть отношение has_many / assign_to. Например, автомобиль has_many: шины.

Проблема, с которой я столкнулся, заключалась в том, что tyres_attributes нужно было вкладывать ВНУТРИ автомобиля json, а не рядом с ним. Я закончил что-то вроде этого:

toJSON: function(){

  json = {car : this.attributes};
  json.car.tires_attributes = this.get('tires').toJSON();
  return json;

}

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

0 голосов
/ 29 ноября 2014

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

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

redCar.save({}, {
    contentType: 'application/json',
    data: JSON.stringify({car: redCar.toJSON(), engines_attributes: redCar.get('engines').toJSON()})
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...