2011-12-17 3 views
1

중첩 모델 예제에서 코드 백백 \ 백본 레일을 사용하고 있습니다 (예 : 작업 컬렉션이 있고 각각 세부 정보 컬렉션을 가질 수 있습니다. 예).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 
      } 
     ] 
    } 
} 

참고 : 나는 응용 프로그램을로드 할 때 나는 "열심히"내 중첩 된 데이터를로드하기 때문에, 나는 (details_attributes 형식으로 볼) 업데이 트 에 다시 서버로 보낼거야 Task toJSON 메소드를 재정 의하여 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

이것은 나에게 가깝다 - (그리고 나는 자바 스크립트 전문가가 아니다) - 내 콘솔 로그에서 더 잘 보이는 것을 볼 수 있지만, 서버로 보내면 json은 다음과 같이 보일 것이다 :'{ "object Object "=> nil,"user_id "=>"1 ","id "=>"6 "}'- Backbone.sync 용 슈퍼를 호출 할 때 뭔가 잘못하고 있습니다 ... –

+0

실제로 - 잘못되었습니다. - 레일은 해시 대신 배열로 데이터를 보내는 것으로 괜찮 았지만 세부 정보와 details_attributes를 보내는 데 문제가있었습니다. 내 toJSON 메서드에서 세부 정보를 필터링했는데 작동 중입니다 ... –

+0

상관 없어요 - 이제 동기화로 무엇을 할 수 있는지 알고 있습니다! –