簡體   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