[英]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 中執行雙重任務:
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
。
我發現把
model.unset("created_at");
model.unset("updated_at");
model.save()
解決了這個問題。 如果您需要這些屬性,這將不起作用,但如果不需要它們,這將起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.