Магистральные и Rails-вложенные маршруты

У меня есть следующие маршруты, определенные в rails:

resources :accounts do
  resources :transactions
end

Это приводит к URL-адресам вроде:

/accounts/123/transactions/1

Есть ли простой способ сопоставить это с базовой моделью?

Ответ 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

Ответ 2

Это может быть не простой способ, но я думаю, что лучший способ - использовать 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 в позвоночнике, и мне не очень больно для меня, чтобы я искал ее в другой библиотеке:)

Ответ 3

Магистраль напрямую не поддерживает создание вложенных 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

Ответ 4

Просто укажите 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