Backbone.js использует не отдыхающие действия на спокойной модели - PullRequest
13 голосов
/ 22 февраля 2012

У меня есть обычная модель отдыха, которую я получаю, создаю, удаляю и обновляю. Кроме того, я хотел бы вызвать специальные действия в этой модели, например 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 ]

31 голосов
/ 23 февраля 2012

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

8 голосов
/ 23 февраля 2012

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