1

私はこれが以前に尋ねられたことを知っています、そして私はそれを機能させています、しかし私はそれがどのように/なぜ機能するのかわかりません、そして誰かが私にそれを説明できることを望んでいました。

モデルがあり、一度に1つの属性のみを変更しています。編集インプレース編集の必要がないため、モデル全体を毎回サーバーに送信したくありません。

このようにモデルを保存します

update_field:function(e){
    var value = $('#update')。val();
    var key = $(e.currentTarget).parent()。attr('id');
    MyModel.attributes [key] = value;
    MyModel.save({key:value}、{patch:true}、{
                成功:function(){
                    alert('保存済み');
                }、
                エラー:function(){
                    alert('レシピの更新に問題があります');
                }});
    }、

サーバーに送信されたもののペイロードを表示すると、モデル全体が送信されていますが、railsコンソールには更新されている更新済みフィールドのみが表示されます。これは印象的ですが、同時に混乱を招きます。何を更新する必要があるかをどのように知るのですか。

これに対する私の最大の不満は、更新で添付ファイルが保存されていないのに、Paperclipが添付ファイルを保存しようとすることだと思います。

ここで私が間違っていることはありますか?Backboneはどの属性を更新するかをRailsにどのように伝えますか。本当に必要な属性だけを送信する方法はありますか?

また、何らかの理由で成功関数がトリガーされていません。私はそれが関連しているとは思えませんが。

4

1 に答える 1

1

パッチ同期モデル全体を送信するのではなくmodel.save()、最初の引数として指定した属性のみを送信します。

model.save({foo: 'bar'}, {patch:true}); // -> PATCH /model/id {foo:bar}

ここで手足を動かして、古いバージョンのBackboneを使用していると推測します。PATCHサポートはでのみ追加され0.9.9、以前のバージョンではpatch:true引数は単に無視されていました。これが正しければ、実際にPUTリソースにリクエストを送信しています。

更新されたフィールドのみがコンソールに表示されると言うとき、それが何を意味するのかを言うのに十分なRailsはわかりませんが、フィールドが変更されるたびに更新を送信するので、ActiveRecord/使用している可能性のあるORMはおそらく他のすべてのフィールドはデータベースにすでに存在するフィールドと一致するため、実際に変更されたフィールド(この場合は、期待したフィールド)のみをコピーして更新するのに十分なインテリジェント機能を備えています。

または、完全にベースから外れている可能性がありますが、実際には別の問題があります。その場合は返信してください。回答を編集/削除します。

編集:また、間違って渡したため、成功ハンドラーは呼び出されていません。ここで行うように3つの引数を渡す代わりに、次のようにします。

MyModel.save({key: value},{patch: true},{success:...});

patchsaveメソッドは、設定する属性と、およびを含む複数のオプションを定義する可能性のあるオプションハッシュの2つの引数のみを想定していますsuccess

MyModel.save({key: value},{patch: true, success:...});
于 2013-01-29T11:16:06.273 に答える