更新部分骨干模型

时间:2013-01-29 10:58:53

标签: ruby-on-rails-3 backbone.js model

我知道之前已经问过这个问题,而且我已经开始工作了,但我不确定它是如何工作的,为什么它有效,希望有人可以向我解释。

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

我像这样保存模型


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},{
                success: function(){
                    alert('saved');
                },
                error: function(){
                    alert('problem updating recipe');
                }});
    },

当我查看发送到服务器的内容的有效负载时,整个模型正在发送,但rails控制台仅显示正在更新的更新字段。我发现这令人印象深刻,但同时令人困惑。它是如何知道需要更新的内容。

我认为我最大的抱怨是Paperclip试图保存附件,即使更新中没有保存附件。

我在这里做错了吗? Backbone如何告诉Rails要更新哪些属性。 有没有办法真正只发送必要的属性?

另外,由于某种原因,我的成功功能没有被触发。虽然我怀疑这是相关的。

1 个答案:

答案 0 :(得分: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方法只需要两个参数,即要设置的属性和options hash,它们可以定义多个选项,包括patchsuccess

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