2011-11-30 30 views
10

Tôi đã các tuyến đường sau quy định tại đường ray:Backbone và Rails đường Nested

resources :accounts do 
    resources :transactions 
end 

Điều này dẫn đến các url như:

/accounts/123/transactions/1 

Có một cách dễ dàng để lập bản đồ này để một bộ mô hình xương sống lên?

Trả lời

21

Hóa ra xương sống khá dễ dàng hỗ trợ này bằng cách làm tổ một bộ sưu tập trong một mo del như sau:

var Account = Backbone.Model.extend({ 

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

Điều này đạt được chính xác những gì tôi muốn.

Bạn có thể đọc thêm về nó ở đây: http://documentcloud.github.com/backbone/#FAQ-nested

+2

Điều này hoạt động tốt cho các mô hình hiện có được tải từ chương trình phụ trợ thông qua cuộc gọi tìm nạp. Nhưng những gì về một mô hình mà tôi vừa tạo ra? Khi phương thức khởi tạo được gọi, cuộc gọi ajax tạo bản ghi trong phần phụ trợ chưa hoàn thành và trường 'this.id' này là' undefined'. Bất kỳ ý tưởng về cách đối phó với điều này? – Ernesto

+0

Một cách để xử lý việc tạo url cho các mô hình vừa được tạo ra là làm cho url trở thành một hàm thay vì một chuỗi. Vì vậy, dòng trên có thể được thay đổi thành: 'this.transactions.url = function() {return '/ account /' + this.id + '/ transactions'};' – stereoscott

1

Chỉ cần xác định địa chỉ của mô hình của bạn hoặc (nếu bạn sử dụng một) bộ sưu tập của bạn như vậy:

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

hoặc động:

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

Những mô hình hay tất cả các mẫu của một bộ sưu tập đó là được định cấu hình theo cách này giờ đây sẽ tạo các url phụ trợ của nó cho phù hợp.

thông tin chi tiết:

mẫu: http://documentcloud.github.com/backbone/#Model-url

Bộ sưu tập: http://documentcloud.github.com/backbone/#Collection-url

+0

Ý chí đầu tiên có lẽ không làm việc ở đó sẽ có nghĩa là tất cả các giao dịch sẽ thuộc về rằng một tài khoản mà không phải là trường hợp. Nó sẽ là tuyệt vời nếu người ta có thể định nghĩa url là 'accounts /: account_id/transactions' chẳng hạn. tôi sẽ điều tra tùy chọn thứ hai. –

+1

Nó cũng có thể ghi đè lên các phương pháp url() của mô hình và các bộ sưu tập.Các cơ chế xây dựng url phức tạp hơn có thể được triển khai ở đó. – ProTom

4

Nó có thể không phải là một cách dễ dàng nhưng tôi nghĩ cách tốt nhất là sử dụng url và đặt nó là một chức năng như thế này:

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

Hoặc có thể bằng coffeescript (vì nó là backb một + đường ray):

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

Oh và bạn có thể làm điều đó như thế này (chắc chắn với tổ sâu hơn nó tốt hơn):

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


AFAIK hiện nay là tiện ích url trong xương sống , và nó không phải nhiều đau đớn đủ cho tôi vì vậy mà tôi sẽ tìm kiếm một trong một số thư viện khác :)

2

Backbone không trực tiếp hỗ trợ việc tạo các url lồng nhau. Bạn phải sử dụng một hàm để tự động tính toán url kết quả của đối tượng lồng nhau của bạn. Ví dụ:

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

Thông tin thêm: http://documentcloud.github.com/backbone/#FAQ-nested

Các vấn đề liên quan