2012-02-22 12 views
13

Ho un modello regolare e riposante che ottengo, creo, cancello e aggiorno. Per di più, mi piacerebbe chiamare azioni speciali su quel modello, come change_password.Backbone.js che utilizza azioni non restful su un modello riposante

I percorsi RESTful regolari sono Rails tradizionali 3 percorsi:

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

Ma, al di sopra di quelli, non ho le operazioni speciali:

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

E così via.

Cosa devo impostare sul modello, in modo che riconosca quelle nuove azioni e come avvolgere le chiamate in metodi modello?

risposta

30

È abbastanza semplice aggiungere nuovi metodi a un modello: è sufficiente specificare i nuovi metodi in .extend(). È necessario codificare un pò da sola, ma è possibile usufruire dei macchinari esistenti come Backbone.sync (per lo più solo un wrapper per $.ajax()) ed esistente url proprietà del modello:

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 

}); 

Proprio come un commento, dal punto di vista REST , le operazioni changePassword e activate devono essere non essere metodi GET - tutti i metodi GET devono essere idempotenti. Questo non è solo RESTIFIANISMO, è una buona idea: potresti finire con la cache di questi URL (quindi non succede nulla) o colpendoli più volte per sbaglio (di solito richiede la conferma dell'utente con una richiesta POST). Effettua queste chiamate POST se puoi.

+2

Grazie per l'osservazione su GET contro POST, li cambierò di sicuro. – kolrie

+0

Il parametro "POST" sembra non avere effetto. Il verbo "CLICK" sembra invece essere usato (Chrome). –

+0

Non sai cosa intendi qui - non esiste un verbo 'CLICK' in HTTP, quindi? – nrabinowitz

8

Vorrei suggerire che, se possibile, aggiungere un modello di password/controller in cui è possibile chiamare su per modificare la password. Questo segue gli standard REST ed è costruito in termini di funzionalità di Backbone.js

Se questo non è un'opzione, il seguente è un esempio di CoffeeScript, aggiungere questo al modello:

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

perché non funziona: 'success: => console.log 'success'' (invece di completo)? – itsnikolay

Problemi correlati