2011-11-30 16 views
10

ho i seguenti percorsi definiti nella rotaie:Backbone e Rails Itinerari nidificate

resources :accounts do 
    resources :transactions 
end 

Questo si traduce in URL del tipo:

/accounts/123/transactions/1 

C'è un modo semplice per mappare questo ad un insieme modello di spina dorsale su?

risposta

21

La spina dorsale risulta abbastanza semplice da supportare inserendo una raccolta in un mese del come segue:

var Account = Backbone.Model.extend({ 

    initialize: function() { 
    this.transactions = new TransactionsCollection; 
    this.transactions.url = '/account/' + this.id + '/transactions'; 
    this.transactions.bind("reset", this.updateCounts); 
    }, 
}); 

Questo raggiunge esattamente quello che volevo.

Si può leggere di più su di esso qui: http://documentcloud.github.com/backbone/#FAQ-nested

+2

Funziona bene per i modelli esistenti caricati dal back-end tramite una chiamata fetch. Ma che dire di un modello che ho appena creato? Quando viene chiamato il metodo di inizializzazione, la chiamata ajax che crea il record nel backend non è terminata e il campo 'this.id' è' indefinito'. Qualche idea su come far fronte a questo? – Ernesto

+0

Un modo per gestire la generazione di URL per i modelli appena creati consiste nel rendere l'url una funzione piuttosto che una stringa. Quindi, la riga precedente potrebbe essere cambiata in: 'this.transactions.url = function() {return '/ account /' + this.id + '/ transactions'};' – stereoscott

1

Basta definire l'URL del vostro modello o (se si utilizza uno) la vostra collezione in questo modo:

var MyModel = Backbone.Model.extend({ 
    url: 'accounts/123/transactions' 
}); 

o dinamicamente:

mymodel.url = 'accounts/' + accountId + '/transactions'; 

Questi modelli o tutti i modelli di una collezione che è configurato in questo modo ora genererà di conseguenza gli URL di back-end.

Informazioni dettagliate:

Modello: http://documentcloud.github.com/backbone/#Model-url

Collezione: http://documentcloud.github.com/backbone/#Collection-url

+0

Il primo probabilmente non funzionerà a esso significherebbe che tutte le transazioni apparterrebbero a quella conto che non è il caso. Sarebbe bello se si potesse definire l'url come "account /: account_id/transazioni" per esempio. Indagherò la seconda opzione. –

+1

È anche possibile sovrascrivere il metodo url() di modelli e raccolte.Lì potrebbero essere implementati meccanismi di costruzione di url più complessi. – ProTom

4

non potrebbe essere un modo semplice, ma penso che il modo migliore è quello di utilizzare l'URL e impostarlo su una funzione così:

var Transaction = Backbone.Model.extend({ 
    url: function(){ 
     var url = 'accounts/"+this.account_id+"/transactions'; 
     if (this.id !== undefined){ 
      url += "/"+this.id 
     } 
     return url; 
    } 
}); 

O forse in coffeescript (come è backb uno + rotaie):

class Transaction extends Backbone.Model 
    url: -> 
     url = "accounts/#{@account_id}/transactions" 
     url += "/#{@id}" if @id != undefined 
     url 

Oh, e si potrebbe fare di più in questo modo (sicuramente con nidificazione più profondo è meglio):

var url = ["accounts", this.account_id, "transactions"] 
if (this.id !== undefined) url.push(this.id) 
return url.join("/") 


mi risulta, c'è ora di utilità url nella spina dorsale , e non è abbastanza dolore per me, quindi ne cercherò uno in qualche altra libreria :)

2

Backbone non supporta direttamente la creazione di URL nidificate. È necessario utilizzare una funzione per calcolare in modo dinamico l'url risultante dell'oggetto nidificato. Per esempio:

var Account = Backbone.Model.extend({ 

    initialize: function() { 
    this.transactions = new TransactionsCollection(); 
    var self = this; 
    this.transactions.url = function() {return self.url + self.id + '/transactions';}; 
    // etc 
    }, 
}); 

Maggiori informazioni: http://documentcloud.github.com/backbone/#FAQ-nested

Problemi correlati