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

时间:2012-11-12 21:53:39

标签: ruby-on-rails backbone.js

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

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

这是有道理的。这些属性受到保护,应受到保护。 Backbone不应该尝试更新这些属性,但Backbone不知道更好。

当然,一个选项是删除我的Rails控制器中的params[:created_at]等,但我可以想象得到真正非干的很快,加上它似乎是错误的必须这样做

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

2 个答案:

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

  1. toJSON用于序列化服务器的模型和集合。
  2. toJSON用于序列化视图的模型和集合。
  3. 如果您仍想在视图中使用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

答案 1 :(得分:1)

我找到了

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

修复了问题。如果您需要这些属性,这将无效,但如果不需要,则可以正常工作。