Backbone希望包含created_at,updated_at等,但我不想这样做

我正在使用Backbone和Rails。 我有一个模型,我可以创建和销毁就好了。 但是,当我编辑时,我收到此错误:

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中执行双重任务:

  1. toJSON用于序列化服务器的模型和集合。
  2. toJSON用于序列化视图的模型和集合。

如果您仍想在视图中使用updated_atcreated_at ,那么我建议添加另一个方法,比如serialize_for_view ,它执行标准toJSON所做的事情:

 serialize_for_view: function() { return _(this.attributes).clone(); } 

然后使用var html = this.template({m: this.model.serialize_for_view()})来构建视图的HTML。 如果你想在任何地方使用它,你也可以将serial serial_for_view修补到Backbone.Model.prototype

我找到了

 model.unset("created_at"); model.unset("updated_at"); model.save() 

解决了这个问题。 如果您需要这些属性,这将无效,但如果不需要,则可行。