我正在使用Backbone和Rails。我有一个模型,我可以创建和销毁就好了。但是,当我编辑时,我收到此错误:
Can't mass-assign protected attributes: created_at, id, updated_at
这是有道理的。这些属性受到保护,应受到保护。 Backbone不应该尝试更新这些属性,但Backbone不知道更好。
当然,一个选项是删除我的Rails控制器中的params[:created_at]
等,但我可以想象得到真正非干的很快,加上它似乎是错误的必须这样做
我有没有办法告诉Backbone不要在表单中包含这些属性?
答案 0 :(得分:2)
要么不将它们发送给客户端,以便您的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
。
答案 1 :(得分:1)
我找到了
model.unset("created_at");
model.unset("updated_at");
model.save()
修复了问题。如果您需要这些属性,这将无效,但如果不需要,则可以正常工作。