Подтвердить что ты не робот

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

И так далее.

Что мне нужно настроить на модели, чтобы он распознавал эти новые действия и как переносить вызовы в методы модели?

4b9b3361

Ответ 1

Довольно просто добавить новые методы в модель - просто укажите новые методы в .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-вызовы, если сможете.

Ответ 2

Я бы посоветовал, если возможно, добавить модель/контроллер паролей, где вы можете вызвать сохранить, чтобы изменить пароль. Это следует стандартам 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)