我使用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}似乎很矛盾 - 我从未确定如何调和这一点。
答案 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)
我找到了这个宝石!也许帮助你。
http://blog.dtmtec.com.br/blog/2013/05/power-up-your-backbone-models-with-nested-attributes/
答案 3 :(得分:0)
我相信我们可以使用Backbone sync
或使用rails后端(或周围)执行某些操作,因为两者之间的通信存在问题。覆盖toJSON()
方法可能会导致意外结果,因为这是通用方法,应用程序的其他部分可能依赖于,例如视图。
可能快速解决方案:
redCar.save({}, {
contentType: 'application/json',
data: JSON.stringify({car: redCar.toJSON(), engines_attributes: redCar.get('engines').toJSON()})
});