1

我知道以前有人问过这个问题,并且我可以使用它,但是我不确定它是如何/为什么起作用的,并且希望有人可以向我解释。

我有一个模型,一次只更改一个属性。我不想每次都将整个模型发送到服务器,因为不需要就地编辑。

我这样保存模型

更新字段:函数(e){
    var value = $('#update').val();
    var key = $(e.currentTarget).parent().attr('id');
    MyModel.attributes[key] = value;
    MyModel.save({key: value},{patch: true},{
                成功:函数(){
                    警报(“已保存”);
                },
                错误:函数(){
                    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 可能足够智能,只复制和更新实际更改的字段——在您的情况下,是您期望的字段,因为所有其他字段都与数据库中已有的字段匹配。

否则我可能会完全偏离基础,实际上还有其他问题。如果是这种情况,请回复,我将编辑/删除我的答案。

编辑:另外,您的成功处理程序没有被调用,因为您错误地传递了它。而不是像您在此处那样传递三个参数:

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

save 方法只需要两个参数,要设置的属性和选项哈希,它可以定义多个选项,包括patchsuccess

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