2

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

Can't mass-assign protected attributes: created_at, id, updated_at

那讲得通。这些属性受到保护,它们应该受到保护。Backbone 不应该尝试更新这些属性,但 Backbone 并不知道更好。

当然,一种选择是params[:created_at]在我的 Rails 控制器中删除等,但我可以想象很快就会变得非常不干燥,而且这样做似乎是错误的。

有没有办法告诉 Backbone 不要在其表单中包含这些属性?

4

2 回答 2

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如果这对您有意义,您甚至可以将其直接修补。

更改的缺点toJSONtoJSON往往在 Backbone 中执行双重任务:

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

如果您仍想在视图中使用updated_atand 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

于 2012-11-12T22:34:29.987 回答
1

我发现把

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

解决了这个问题。如果您需要这些属性,这将不起作用,但如果不需要它们,这将起作用。

于 2013-02-21T21:02:03.367 回答