繁体   English   中英

Backbone 想要包含 created_at、updated_at 等,但我不希望它包含

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

  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。 如果你想在任何地方使用它,你也可以将serialize_for_view修补到Backbone.Model.prototype

我发现把

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM