2011-11-30 10 views
10

he definido las siguientes rutas en rieles:Backbone y rieles Rutas anidadas

resources :accounts do 
    resources :transactions 
end 

Esto se traduce en URLs como:

/accounts/123/transactions/1 

hay una manera fácil de asignar a un conjunto de modelos columna vertebral ¿arriba?

Respuesta

21

Resulta que la columna vertebral es bastante fácil de soportar al anidar una colección en un mo del de la siguiente manera:

var Account = Backbone.Model.extend({ 

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

Esto logra exactamente lo que yo quería.

Puede leer más sobre esto aquí: http://documentcloud.github.com/backbone/#FAQ-nested

+2

Esto funciona bien para los modelos existentes cargados desde el back-end a través de una llamada de recuperación. Pero, ¿qué pasa con un modelo que acabo de crear? Cuando se llama al método de inicialización, la llamada ajax que crea el registro en el back-end no ha terminado, y el campo 'this.id' está' 'undefined'. ¿Alguna idea sobre cómo lidiar con esto? – Ernesto

+0

Una forma de manejar la generación de URL para los modelos que acabamos de crear es hacer que la url sea una función en lugar de una cadena. Por lo tanto, la línea anterior podría cambiarse a: 'this.transactions.url = function() {return '/ account /' + this.id + '/ transactions'};' – stereoscott

1

Sólo definir la URL de su modelo o (si se utiliza uno) su colección de este modo:

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

o dinámica:

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

Esos modelos o todos los modelos de una colección que es configurado de esta manera ahora generará sus URL de back-end en consecuencia.

información detallada:

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

Colección: http://documentcloud.github.com/backbone/#Collection-url

+0

La primera probablemente no funcionará en ello significaría que todas las transacciones que pertenecerían a una cuenta que no es el caso. Sería genial si uno pudiera definir la url como 'cuentas /: cuenta_id/transacciones', por ejemplo. Investigaré la segunda opción. –

+1

También es posible anular el método url() de modelos y colecciones.Mecanismos de construcción de url más complejos podrían implementarse allí. – ProTom

4

Puede que no sea una manera fácil, pero creo que la mejor manera es utilizar URL y ponerlo en una función como este:

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

O tal vez en coffeescript (como es backb uno + carriles):

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

Ah, y que podría hacerlo de la misma familia (seguramente con anidación más profundo es mejor):

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


yo sepa ahora hay utilidad de URL en la columna vertebral , y no es demasiado dolor para mí, así que buscaría uno en otra biblioteca :)

2

Backbone no soporta directamente la creación de URLs anidados. Debe usar una función para calcular dinámicamente la URL resultante de su objeto anidado. Por ejemplo:

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 
    }, 
}); 

Más información: http://documentcloud.github.com/backbone/#FAQ-nested

Cuestiones relacionadas