2

RailsでBackboneを使用しています。うまく作成して破壊できるモデルがあります。ただし、編集すると、次のエラーが発生します。

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

それは理にかなっている。これらの属性は保護されているため、保護する必要があります。バックボーンはこれらの属性を更新しようとしてはいけませんが、バックボーンはそれをよく知りません。

もちろん、1つのオプションはparams[:created_at]、Railsコントローラーの削除などですが、DRYが非常に速くなることは想像に難くありません。さらに、それを行うのは間違っているように思われます。

これらの属性をフォームに含めないようにBackboneに指示する方法はありますか?

4

2 に答える 2

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それがあなたにとって理にかなっているなら、あなたはその権利にモンキーパッチを当てることさえできます。

変更の欠点はtoJSONtoJSONバックボーンで2つの役割を果たしがちなことです。

  1. toJSONサーバーのモデルとコレクションをシリアル化するために使用されます。
  2. toJSONビューのモデルとコレクションをシリアル化するために使用されます。

それでもビューで使用updated_atしたい場合は、別のメソッドを追加することをお勧めします。たとえば、標準の機能を実行します。created_atserialize_for_viewtoJSON

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

于 2012-11-12T22:34:29.987 に答える
1

私はそのパッティングを見つけました

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

問題を修正しました。これらの属性が必要な場合は機能しませんが、必要がない場合は機能します。

于 2013-02-21T21:02:03.367 に答える