我有一个常规的宁静模型,我可以获取,创建,删除和更新。最重要的是,我想对该模型进行特殊操作,例如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
等等。
我需要在模型上设置什么,以便识别这些新操作,以及如何将调用包装到模型方法中?
答案 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角度来看,您的changePassword
和activate
操作不应该是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)