2012-02-22 29 views
13

Tôi có một mô hình ổn định thường xuyên mà tôi nhận được, tạo, xóa và cập nhật. Trên hết, tôi muốn gọi các hành động đặc biệt trên mô hình đó, như change_password.Backbone.js sử dụng các hành động không an toàn trên mô hình yên tĩnh

Các tuyến đường thường xuyên RESTful là Rails truyền thống 3 tuyến đường:

fetch => GET /api/models/:id 
save => PUT /api/models/:id 
create => POST /api/models 
destroy => DELETE /api/models/:id 

Nhưng, trên đầu trang của những người, tôi có hoạt động đặc biệt:

changePassword => GET /api/models/:id/change_password 
activate  => GET /api/models/:id/activate 

Và vân vân.

Tôi cần gì để thiết lập trên mô hình, vì vậy nó nhận ra những hành động mới đó và cách kết nối các cuộc gọi thành các phương thức mô hình?

Trả lời

30

Thật đơn giản để thêm các phương thức mới vào Mô hình - chỉ cần chỉ định các phương thức mới trong .extend(). Bạn phải mã số này cho mình, nhưng bạn có thể tận dụng lợi thế của máy móc thiết bị hiện có như Backbone.sync (chủ yếu chỉ là một wrapper quanh $.ajax()) và url tài sản hiện có của mẫu:

var MyModel = Backbone.Model.extend({ 

    activate: function(opts) { 
     var model = this, 
      url = model.url() + '/activate', 
      // note that these are just $.ajax() options 
      options = { 
       url: url, 
       type: 'POST' // see my note below 
      }; 

     // add any additional options, e.g. a "success" callback or data 
     _.extend(options, opts); 

     return (this.sync || Backbone.sync).call(this, null, this, options); 
    }, 

    // etc 

}); 

Cũng giống như một lời nhận xét, từ góc độ REST của , các hoạt động changePasswordactivate của bạn phải không phải là là phương thức GET - tất cả các phương thức GET phải là không có giá trị. Đây không chỉ là RESTIFarianism, nó là một ý tưởng tốt - bạn có thể kết thúc bộ nhớ đệm các URL này (do đó không có gì xảy ra) hoặc nhấn chúng nhiều lần do tai nạn (thường yêu cầu xác nhận người dùng với yêu cầu POST). Thực hiện các cuộc gọi POST này nếu bạn có thể.

+2

Cảm ơn bạn đã nhận xét về GET so với POST, tôi sẽ thay đổi chúng một cách chắc chắn. – kolrie

+0

Thông số 'POST' dường như không có hiệu lực. Thay vào đó, động từ 'CLICK' có vẻ được sử dụng (Chrome). –

+0

Không chắc chắn những gì bạn có ý nghĩa ở đây - không có động từ 'CLICK' trong HTTP, vì vậy? – nrabinowitz

8

Tôi khuyên rằng nếu có thể thêm mẫu/bộ điều khiển mật khẩu, tại đó bạn có thể gọi để lưu để thay đổi mật khẩu. Đây theo tiêu chuẩn REST và được xây dựng trong chức năng của Backbone.js

Nếu đó không phải là một lựa chọn, sau đây là một ví dụ CoffeeScript, thêm video này vào mô hình của bạn:

activate: -> 
    unless user.get('active') 
    (@sync || Backbone.sync).call @, 'activate', @, 
     url: "#{@url()}/users/#{message.get('id')}/activate" 
     data: {} 
     complete: => 
     user.set(active: true) 
     @set(active: true) 
+0

tại sao không hoạt động: 'thành công: => console.log 'success'' (thay vì hoàn thành)? – itsnikolay

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