Backbone.js在restful模型上使用非restful操作

时间:2012-02-22 19:30:00

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

我有一个常规的宁静模型,我可以获取,创建,删除和更新。最重要的是,我想对该模型进行特殊操作,例如change_password。

常规RESTful路由是传统的Rails 3路由:

fetch   => GET    /api/models/:id
save    => PUT    /api/models/:id
create  => POST   /api/models
destroy => DELETE /api/models/:id

但是,除此之外,我还有特殊的操作:

changePassword => GET /api/models/:id/change_password
activate       => GET /api/models/:id/activate

等等。

我需要在模型上设置什么,以便识别这些新操作,以及如何将调用包装到模型方法中?

2 个答案:

答案 0 :(得分:31)

向模型添加新方法相当简单 - 只需在.extend()中指定新方法即可。您必须自己编写其中一些代码,但是您可以利用现有的机制,例如Backbone.sync(主要是$.ajax()的包装器)和模型的现有url属性:

var MyModel = Backbone.Model.extend({

    activate: function(opts) {
        var model = this,
            url = model.url() + '/activate',
            // note that these are just $.ajax() options
            options = {
                url: url,
                type: 'POST' // see my note below
            };

        // add any additional options, e.g. a "success" callback or data
        _.extend(options, opts);

        return (this.sync || Backbone.sync).call(this, null, this, options);
    },

    // etc

});

作为评论,从REST角度来看,您的changePasswordactivate操作应该是GET方法 - 所有GET方法都应该是幂等的。这不仅仅是RESTifarianism,它是一个好主意 - 您最终可能会缓存这些URL(因此没有任何反应)或者偶然多次击中它们(通常需要用户确认POST请求)。如果可以,请进行这些POST调用。

答案 1 :(得分:8)

我建议如果可能的话添加密码型号/控制器,您可以在其中调用保存来更改密码。这遵循REST标准,并且内置Backbone.js的功能

如果这不是一个选项,以下是CoffeeScript示例,请将其添加到您的模型中:

activate: ->
  unless user.get('active')
    (@sync || Backbone.sync).call @, 'activate', @,
      url: "#{@url()}/users/#{message.get('id')}/activate"
      data: {}
      complete: =>
        user.set(active: true)
        @set(active: true)