2012-02-22 13 views
13

Elde ettiğim, oluşturduğum, sildiğim ve güncelleştirdiğim düzenli bir model var. Bunun üzerine, bu modelde change_password gibi özel eylemler aramak istiyorum. böyleceBackbone.js Huzurlu bir modelde dinlenmeyen eylemler kullanarak

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

Ve: O üstüne, ben özel operasyonları var,

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

Ama:

düzenli RESTful yolları geleneksel Raylar 3 yolları vardır.

Model üzerinde ne yapmam gerekiyor, bu nedenle bu yeni eylemleri ve çağrıları model yöntemlerine nasıl kaydedeceğini biliyor?

cevap

30

Modele yeni yöntemler eklemek oldukça basit - sadece .extend() numaralı yeni yöntemleri belirtin. Kendine bu bazı kodlamak var, ama Backbone.sync gibi mevcut makinelerin (çoğunlukla sadece $.ajax() etrafında sarıcı) ve Model'in mevcut url özelliği yararlanabilirsiniz: REST perspektifinden,

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 

}); 

Sadece bir yorum olarak Sizin changePassword ve activate işlemleriniz GET yöntemleri değil - tüm GET yöntemleri idempotent olmalıdır. Bu sadece RESTifarianism değil, iyi bir fikir - bu URL'leri önbelleğe alabilir (böylece hiçbir şey olmuyor) veya kazayla birden çok kez çarpabilirsiniz (genellikle bir POST isteğiyle kullanıcı onayı gerekir). Yapabilirseniz bu POST çağrılarını yapın.

+2

GET hakkında sözler için teşekkür ederiz POST, onları kesin olarak değiştireceğim. – kolrie

+0

'POST' parametresinin bir etkisi yok gibi görünüyor. Bunun yerine 'TIKLAYIN' fiili kullanılıyor (Chrome). –

+0

Burada ne demek istediğinizden emin değilsiniz - HTTP'de "CLICK" fiili yok, öyle mi? – nrabinowitz

8

Mümkünse, parolayı değiştirmek için kaydetmek için numarasını arayabileceğiniz bir Password model/controller ekleyin. Bu DİNLENME standartlarına uyar ve bir CoffeeScript örnek Aşağıdaki, modeliniz bu eklemek bir seçenek değilse backbone.js

işlevselliği inşa edilmiştir:

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) 
+0

neden çalışmıyor: 'başarı: => console.log 'başarı' (tam yerine)? – itsnikolay