Backbone和Rails嵌套路由

时间:2011-11-30 20:05:06

标签: ruby-on-rails backbone.js

我在rails中定义了以下路由:

resources :accounts do
  resources :transactions
end

这会产生以下网址:

/accounts/123/transactions/1

有没有一种简单的方法可以将其映射到骨干模型设置?

4 个答案:

答案 0 :(得分:21)

通过在模型中嵌套集合,非常容易支持这一点,如下所示:

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

答案 1 :(得分:4)

这可能不是一种简单的方法,但我认为最好的方法是使用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实用程序,对我来说痛苦不够,所以我会在其他库中搜索一个:)

答案 2 :(得分:2)

Backbone不直接支持嵌套网址的创建。必须使用函数动态计算嵌套对象的结果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

答案 3 :(得分:1)

只需定义您的模型的网址或(如果您使用的话)您的收藏品如下:

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

或动态:

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

以这种方式配置的那些模型或集合的所有模型现在将相应地生成它的后端URL。

详细信息:

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

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