2011-12-17 6 views
1

ネストされたモデルの例では、私はcodebrew \ backbone-railsを使用しています(私はタスクのコレクションを持っています。例)。Backbone.js - レールとネストされたコレクションの使用に関する指針

私は必要なデータを表示するために一連の入れ子になったビューをロードして作成できますが、そのデータに対してCRUD操作を実行しようとすると固まってしまいました。

たとえば、外側の(上の)オブジェクトの属性を変更し、そのデータをサーバーに送信したいとします。これは、jsonの外観です。私はしました -

{ 
    "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 
      } 
     ] 
    } 
} 

FYI:私はアプリをロードしたとき、私は「熱心に」私のネストされたデータをロードしているので、私は(details_attributes形式を見て)更新上のサーバーに戻ってそれを送信するつもりですタスクtoJSONメソッドをオーバーライドして、Railsが期待する "_attributes"を持つコレクションをデコレートする

一方、私がこの変更をサーバー上で行った場合、旧式のレール方法(ネストされたフォームを使用)ネストされたオブジェクトのハッシュ(この例では1つしかありませんが)(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は次のようになります: '{" object私が間違っているのは、私がBackbone.syncのためにスーパーを呼び出すときです... –

+0

実際には - 私は間違っていました。 - レールはハッシュの代わりに配列としてデータを送信しても問題ありませんでしたが、詳細とdetails_attributesを送信する際に問題がありました。私はtoJSONメソッドで詳細をフィルタリングしました。それはうまくいきました... –

+0

- 私は今同期で何ができるのか分かっています! –

関連する問題