2011-12-17 85 views
1

我在嵌套模型示例中使用codebrew \ backbone-rails(比如說我有一個任務集合,每個集合都可以有一個Details集合 - 類似於例如。)Backbone.js - 關於使用rails和嵌套集合的指導

我可以加載並創建一系列嵌套的視圖來顯示我想要的數據,但是現在當我試圖對該數據執行CRUD操作時,我卡住了。

例如 - 說我更改我的外部(上?)對象上的屬性,並且想要將該數據發送到服務器。這是json的樣子。自從我「急切地」裝我的嵌套的數據,當我加載應用程序,我將它發送回服務器上的更新(看details_attributes格式)

{ 
    "task" => { 
         "name" => "testupdate", 
        "user_id" => 1, 
         "id" => 3, 
        "Details" => [ 
      [0] { 
         "task_id" => 3, 
        "break_length" => 4, 
         "completed" => false, 
          "id" => 12, 
         "length" => 25, 
        "location_id" => nil, 
          "note" => "test444", 
       "start_date_time" => "2011-12-15T00:00:00Z" 
      } 
     ], 
     "details_attributes" => [ 
      [0] { 
       "start_date_time" => "2011-12-15T00:00:00Z", 
         "completed" => false, 
          "note" => "test444", 
        "break_length" => 4, 
         "task_id" => 3, 
          "id" => 12, 
         "length" => 25, 
        "location_id" => nil 
      } 
     ] 
    } 
} 

僅供參考 - 我另一方面,如果我在服務器上執行了這種更改,使用老式的rails方式(使用嵌套的形式),我發送一個包含「_attributes」的集合嵌套對象的散列(儘管在本例中只有一個(看Details_attributes):

{ 
        "utf8" => "", 
    "authenticity_token" => "iv9wYvgqLt3nldVOX4AeAifpFaSHIfEj85MsPUaMiAw=", 
        "task" => { 
         "name" => "test", 
     "details_attributes" => { 
      "0" => { 
         "_destroy" => "", 
       "start_date_time" => "2011-12-15 00:00:00", 
         "length" => "25", 
         "completed" => "0", 
          "note" => "test444", 
        "break_length" => "4", 
          "id" => "12" 
      } 
     } 
    }, 
       "commit" => "Update task", 
       "user_id" => "1", 
        "id" => "3" 
} 

如何讓我的JSON,在更新任何指導,看起來像它應該服務器接受呢?

感謝您的任何幫助。

回答

1

您可以提供自定義同步方法來覆蓋默認序列化。比如(我希望我不是太遠離你的設置)

var json='{"name":"testupdate", "user_id":1, "id":3, "details_attributes":[{"start_date_time":"2011-12-15T00:00:00Z", "completed":false, "note":"test444", "break_length":4, "task_id":3, "id":12, "length":25}]}'; 

Task = Backbone.Model.extend({ 
    initialize:function() { 
     this.attrs=new DetailsAttributes(this.get("details_attributes")); 
    }, 
    sync: function(method, model, options) { 
     if (method == 'update') { 
      var data = this.toJSON(); 
      data.details_attributes = {}; 
      this.attrs.each(function(model, ix) { 
       data.details_attributes[ix] = model.toJSON(); 
      }); 

      console.log(JSON.stringify(data)); 

      options = _.extend({data: data}, options); 
     } 


     return Backbone.sync.call(this, method, this, options); 
    } 
}); 
DetailAttribute= Backbone.Model.extend(); 
DetailsAttributes= Backbone.Collection.extend({ 
    model:DetailAttribute 
}); 
var tk= new Task(JSON.parse(json)); 
tk.save(); 

http://jsfiddle.net/5gZr5/4/,如果你想檢查控制檯日誌。

Backbone.sync將使用序列化選項中傳遞的數據屬性。

+0

這是接近我 - (和我不是一個JavaScript專家) - 我可以看到什麼看起來在我的控制檯日誌更好,但是當我把它發送到服務器,我的JSON看起來是這樣的:`{「對象對象 「=>零, 」USER_ID「=>」 1" , 「ID」=> 「6」}` - 我做錯事時,我呼籲Backbone.sync超... – 2011-12-17 15:37:53