使用Rails,backbone.js和accepts_nested_attributes_for保存嵌套对象

时间:2011-03-07 22:32:38

标签: ruby-on-rails backbone.js

我使用Rails,backbone.js(现在就学习这个)。我们假设你有两个模型,Car和Engine。

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)相同。事实上,这会将引擎属性包含在engine下,但模型需要{{1}似乎很矛盾 - 我从未确定如何调和这一点。

4 个答案:

答案 0 :(得分:33)

我建议在骨干模型上覆盖toJSON。

toJSON: function(){

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

}
在将数据发送到后端之前,在sync方法中调用了

toJSON。

答案 1 :(得分:2)

非常有帮助。我正在处理类似的情况,这个例子起初对我不起作用。在我的例子中,我有一个has_many / belongs_to关系。例如汽车has_many:轮胎。

我遇到的问题是,tire_attributes需要嵌套在汽车json的INSIDE中,而不是与它相邻。我最终得到了类似的东西:

toJSON: function(){

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

}

希望这有帮助。

答案 2 :(得分:2)

答案 3 :(得分:0)

我相信我们可以使用Backbone sync或使用rails后端(或周围)执行某些操作,因为两者之间的通信存在问题。覆盖toJSON()方法可能会导致意外结果,因为这是通用方法,应用程序的其他部分可能依赖于,例如视图。

可能快速解决方案:

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