У меня есть следующие маршруты, определенные в rails:
resources :accounts do
resources :transactions
end
Это приводит к URL-адресам вроде:
/accounts/123/transactions/1
Есть ли простой способ сопоставить это с базовой моделью?
У меня есть следующие маршруты, определенные в rails:
resources :accounts do
resources :transactions
end
Это приводит к URL-адресам вроде:
/accounts/123/transactions/1
Есть ли простой способ сопоставить это с базовой моделью?
Оказывается, что базовая система довольно легко поддерживает это, встраивая коллекцию в модель следующим образом:
var Account = Backbone.Model.extend({
initialize: function() {
this.transactions = new TransactionsCollection;
this.transactions.url = '/account/' + this.id + '/transactions';
this.transactions.bind("reset", this.updateCounts);
},
});
Это достигается именно тем, что я хотел.
Подробнее об этом можно узнать здесь: http://documentcloud.github.com/backbone/#FAQ-nested
Это может быть не простой способ, но я думаю, что лучший способ - использовать url и установить его в такую функцию:
var Transaction = Backbone.Model.extend({
url: function(){
var url = 'accounts/"+this.account_id+"/transactions';
if (this.id !== undefined){
url += "/"+this.id
}
return url;
}
});
Или, может быть, в coffeescript (так как это позвоночник + рельсы):
class Transaction extends Backbone.Model
url: ->
url = "accounts/#{@account_id}/transactions"
url += "/#{@id}" if @id != undefined
url
О, и вы могли бы сделать это больше, как это (конечно, с более глубоким вложением его лучше):
var url = ["accounts", this.account_id, "transactions"]
if (this.id !== undefined) url.push(this.id)
return url.join("/")
AFAIK теперь есть утилита url в позвоночнике, и мне не очень больно для меня, чтобы я искал ее в другой библиотеке:)
Магистраль напрямую не поддерживает создание вложенных URL-адресов. Вы должны использовать функцию для динамического вычисления полученного URL вашего вложенного объекта. Например:
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
},
});
Дополнительная информация: http://documentcloud.github.com/backbone/#FAQ-nested
Просто укажите URL-адрес вашей модели или (если вы ее используете) в своей коллекции так:
var MyModel = Backbone.Model.extend({
url: 'accounts/123/transactions'
});
или динамически:
mymodel.url = 'accounts/' + accountId + '/transactions';
Эти модели или все модели коллекции, которая настроена таким образом, теперь будут генерировать ее обратные ссылки соответственно.
Подробная информация:
Модель: http://documentcloud.github.com/backbone/#Model-url
Коллекция: http://documentcloud.github.com/backbone/#Collection-url