[英]Backbone wants to include created_at, updated_at, etc., but I don't want it to
我正在使用带有 Rails 的 Backbone。 我有一个模型,我可以很好地创建和销毁它。 但是,当我编辑时,出现此错误:
Can't mass-assign protected attributes: created_at, id, updated_at
那讲得通。 这些属性受到保护,应该受到保护。 Backbone 不应该尝试更新这些属性,但 Backbone 并不知道更好。
当然,一种选择是在我的 Rails 控制器中删除params[:created_at]
等,但我可以想象得到真正不干燥的速度非常快,而且不得不这样做似乎是错误的。
有没有办法告诉 Backbone 不要在其表单中包含这些属性?
要么不要将它们发送到客户端,以便您的 Backbone 模型永远不会知道它们,要么在您的模型中覆盖toJSON
以排除它们。
默认的toJSON
实现非常简单:
toJSON: function() {
return _.clone(this.attributes);
}
所以你可以用这个替换它:
toJSON: function() {
var attrs = _(this.attributes).clone();
delete attrs.created_at;
delete attrs.updated_at;
return attrs;
}
如果对您有意义,您甚至可以将其直接修补到Backbone.Model.prototype
。
改变toJSON
的缺点是toJSON
倾向于在 Backbone 中执行双重任务:
toJSON
用于序列化服务器的模型和集合。toJSON
用于序列化视图的模型和集合。 如果您仍然想在视图中使用updated_at
和created_at
,那么我建议添加另一种方法,比如serialize_for_view
,它执行标准toJSON
作用:
serialize_for_view: function() {
return _(this.attributes).clone();
}
然后使用诸如var html = this.template({m: this.model.serialize_for_view()})
来构建视图的 HTML。 如果你想在任何地方使用它,你也可以将serialize_for_view
修补到Backbone.Model.prototype
。
我发现把
model.unset("created_at");
model.unset("updated_at");
model.save()
解决了这个问题。 如果您需要这些属性,这将不起作用,但如果不需要它们,这将起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.