2011-11-30 15 views
10

私は、次のルートがレールに定義されています:バックボーンとRailsのネストされたルート

resources :accounts do 
    resources :transactions 
end 

これは、のようなURLになり:

/accounts/123/transactions/1 

バックボーンモデルセットにこれをマッピングする簡単な方法がありますアップ?

答えて

21

バックボーンは非常に簡単ですが、これはmo delは次のようになります。

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

これは、フェッチ呼び出しを介してバックエンドからロードされた既存のモデルで正常に動作します。しかし、私が作成したモデルはどうですか? initializeメソッドが呼び出されると、バックエンドにレコードを作成するajax呼び出しは終了せず、 'this.id'フィールドは' undefined'です。どのようにこれに対処するための任意のアイデアですか? – Ernesto

+0

作成されたモデルのURL生成を処理する1つの方法は、urlを文字列ではなく関数にすることです。上記の行は次のように変更できます: 'this.transactions.url = function(){return '/ account /' + this.id + '/ transactions'};' – stereoscott

1

(使用している場合)ちょうどそうのようなあなたのコレクションをお使いのモデルやのURLを定義します。

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

+0

最初はおそらく動作しません。たとえば、account /:account_id/transactionsのようにURLを定義することができれば素晴らしいでしょう。 私は第2のオプションについて調査します。 –

+1

モデルやコレクションのurl()メソッドをオーバーライドすることもできます。より複雑なURL構築メカニズムを実装することができます。 – ProTom

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で1本の+レール):

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("/") 


私の知る限り、今のバックボーン内のURLのユーティリティがあります私にとってはそれほど痛みが少ないので、他の図書館で検索してみましょう:)

2

バックボーンに直接ネストされた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 
    }, 
}); 

詳細情報:それはすべてのトランザクションがケースではありませんその1つのアカウントに属しているだろうことを意味するでhttp://documentcloud.github.com/backbone/#FAQ-nested

関連する問題