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

kol*_*rie 13 backbone.js ruby-on-rails-3

我有一个定期的宁静模型,我得到,创建,删除和更新.最重要的是,我想对该模型进行特殊操作,例如change_password.

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

fetch   => GET    /api/models/:id
save    => PUT    /api/models/:id
create  => POST   /api/models
destroy => DELETE /api/models/:id
Run Code Online (Sandbox Code Playgroud)

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

changePassword => GET /api/models/:id/change_password
activate       => GET /api/models/:id/activate
Run Code Online (Sandbox Code Playgroud)

等等.

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

nra*_*itz 31

向模型中添加新方法相当简单 - 只需指定新方法即可.extend().你必须自己编写一些代码,但是你可以利用现有的机器Backbone.sync(主要只是一个包装器$.ajax())和Model的现有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

});
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您关于GET与POST的评论,我肯定会更改它们. (2认同)

bru*_*upm 8

我建议如果可能的话添加一个密码模型/控制器,你可以调用save来更改密码.这遵循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)
Run Code Online (Sandbox Code Playgroud)