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

标签 ruby-on-rails backbone.js

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

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

这是有道理的。这些属性受到保护,也应该受到保护。 Backbone 不应该尝试更新这些属性,但 Backbone 并不了解更多。

当然,一个选择是删除 Rails Controller 中的 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 用于序列化 View 的模型和集合。

如果您仍然想在 View 中使用 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()}) 之类的东西来构建 View 的 HTML。如果您想在任何地方使用它,您也可以将 serialize_for_view 猴子补丁到 Backbone.Model.prototype 中。

关于ruby-on-rails - Backbone想要包含created_at、updated_at等,但我不希望它包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13352201/

相关文章:

ruby-on-rails - 消息 : Failure/Error: require File. expand_path ('../../config/environment' , __FILE__)

javascript - Backbone 源代码导出的顶级命名空间和使用

ruby-on-rails - 在 Ruby 中处理无限日期(永远持续的事件)的正确方法是什么?

ruby-on-rails - SimpleCov 没有覆盖内部定义/方法

ruby-on-rails - Rspec GET 到另一个端点一秒钟 - ActionController::UrlGenerationError

javascript - 两个 View ,一个模型 - 如何处理两者的获取错误?

javascript - 如何在下划线模板中添加else语句

javascript - 在 Javascript Backbone 类中调用 super 方法

javascript - 如何通过 Backbone.js 或 React.js 使用服务器生成的 HTML 而不是 JSON?

ios - NSDateFormatter 将 rails 字符串转换为 NSDate 返回 nil?