Backbone JS和Ruby on Rails的新问题

时间:2012-05-24 17:05:28

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

好的,所以我们推出了我们的第一个Backbone JS应用程序,现在我们遇到了新问题。 显然,当我最初为评论和评论加载模型时,它们具有“created_at”属性,这些属性包含添加时间的时间戳。当我编辑注释然后执行model.sync()时,它会将“created_at”传递回服务器。现在RoR应用程序跳出来了,正如我们的Rails开发人员告诉我的那样,我不能在任何情况下都不会将“created_at”传递回服务器并且它只是为了显示而计算。

现在必须要付出代价。要么我必须破解Backbone并在sync()之前删除一些属性,或者必须在Rails端完成某些操作。

你对解决方案的建议是什么?

在任何情况下,在model.sync()期间不能传递一些属性可以做些什么?我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

我试图发布到不可变属性时遇到了这个问题。 Backbone模型的问题在于,默认情况下,它们全部或全部发布。但是你可以做部分更新。为了解决这个问题,我创建了一个Backbone.Model后代,并像这样覆盖了model.save:

    save : function(key, value, options) {
        var attributes, opts;

        //Need to use the same conditional that Backbone is using
        //in its default save so that attributes and options
        //are properly passed on to the prototype
        if (_.isObject(key) || key == null) {
            attributes = key;
            opts = value;
        } else {
            attributes = {};
            attributes[key] = value;
            opts = options;
        }

        //Now check to see if a partial update was requested
        //If so, then copy the passed attributes into options.data.
        //This will be passed through to Backbone.sync. When sync
        //sees that there's an options.data member, it'll use it instead of
        //the standard attributes hash.
        if (opts && opts.partialUpdate) {
            opts["data"] = JSON.stringify(attributes);
            opts["contentType"] = "application/json";
        }

        //Finally, make a call to the default save now that we've
        //got all the details worked out.
        return Backbone.Model.prototype.save.call(this, attributes, opts);
    }

这允许我有选择地将我想要的属性发布到后端,如下所示:

//from the view - the GET may have delivered 20 fields to me, but I'm only interested
//in posting the two fields.
this.model.save({
    field1 : field1Value,
    field2 : field2Value
},{
       partialUpdate : true
});

不能告诉你这是如何让我的生活变得如此简单!现在,有人可能会问为什么不只是传递changedAttributes()JSON?原因是因为在某些情况下,更改的属性仅适用于客户端,特别是用于引发对也使用该模型的视图的更改。

无论如何,试试这个......

答案 1 :(得分:1)

您可以添加到您的模型中:

attr_protected :created_at, :updated_at