我自己正在寻找解决这个问题的方法,我想出了我自己的解决方案,灵感来自于trickey 在这篇文章中的 JavascriptMVC 论坛上关于修改serialize()
模型方法以使其与 Rails 更好地配合的建议。
像他的建议一样,我创建了自己的 Model 类扩展,并include
在我的模型上添加了一个字段,您可以在其中列出您想要包含的属性(在 Rails as_json 方法之后的模式)。
can.Model("BaseModel", {}, {
serialize: function() {
var data, retval, serialized;
data = {};
retval = {};
serialized = can.Model.prototype.serialize.call(this);
//check if we're using the "include" fields or not
if (typeof this.constructor.include !== 'undefined') {
can.each(this.constructor.include, function(attr) {
data[attr] = serialized[attr];
});
} else {
data = serialized;
}
//wrap the return value in the model name for Rails purposes, e.g. {"event": {data}}
retval[this.constructor._shortName] = data;
return retval;
}
});
然后在我的模型中,我使用“包含”数组来指示我想要包含哪些字段。通过省略“参加者”和“演讲者”,这些关联的模型将不会被打包到我的序列化 JSON 中,然后发送回服务器。
Event = BaseModel.extend('Event', {
findAll: "GET /admin/events",
findOne: "GET /admin/events/{id}",
create: "POST /admin/events",
update: "PUT /admin/events/{id}",
destroy: "DELETE /admin/events/{id}",
attributes: {
attendees: 'Models.User.models',
speakers: 'Models.User.models'
},
include: ['id', 'name', 'start_time', 'end_time']
}, {});