9

레일 백엔드 API가 포함 된 연습용 백본 앱을 작성 중이며 백본 모델에서의 저장 동작에 대해 혼동스러워합니다.백본 모델이 저장시 서버에 중복 속성을 보내는 이유는 무엇입니까?

팀이 많은 플레이어를 보유하고 있다고 가정 해 봅시다. 수많은 플레이어가있는 팀을 단일 POST에 저장하려고합니다.

class Team < ActiveRecord::Base 
    has_many :players 
    accepts_nested_attributes_for :players 
end 

class Player < ActiveRecod::Base 
    belongs_to :team 
end 

및 백본 클라이언트, 나는 플레이어 모델과 (도시하지 않음)에 정의 된 선수 컬렉션

다음 포함 된 팀 모델 (참고가 : 레일에 따라서

나는 아니오 내가 브라우저에서 내 캐릭터 라인 JSON을 검토 할 때는 팀의 컬렉션)

Demo.Models.Team = Backbone.Model.extend({ 
    urlRoot: '/teams', 
    defaults: { 
    'team_size': 12 
    }, 
    initialize: function() { 
    this.players = new Demo.Collections.Players()); 
    }, 
    toJSON: function() { 
    var json = _.clone(this.attributes); 
    json.players_attributes = this.players.map(function(player) { 
     return player.toJSON(); 
    }); 
    return json; 
    } 
} 

, 모든 것이 좋아 보인다 :

{"team_size":12, "players_attributes":[{"name":"Fred"},{"name":"Jim" },{"name":"Mark"}]} 

최상위 레벨 속성 ('팀 크기')이 최상위 레벨에서 한 번 반복 된 다음 루트 키 아래에서 반복됩니다.

  1. 루트 키 안에 중첩 된 player_attributes을 보장하는 가장 좋은 방법은 무엇입니까 :

    Started POST "/teams" for 127.0.0.1 at 2012-06-07 13:39:40 -0400 
    Processing by TeamsController#create as JSON 
        Parameters: { 
        "team_size"=>12, "players_attributes":[{"name":"Fred"},{"name":"Jim" },{"name":"Mark"}]}, 
        "team"=>{"team_size"=>12} 
        } 
    

    나는 몇 가지 질문이? 그래서 표준 레일 방식으로 TeamController 내부에 중첩 된 저장을 할 수 있습니다. (즉, Team.create (params [: team])) toJSON 내부의 일부 자바 스크립트 해커와 함께이 작업을 수행 할 수 있지만 쉽게 청소 방법.

  2. 은? 나는 전혀 해가 없다 생각하지만, 잘 냄새가 나지 않는이 같은 속성의 중복을 보내려면이 기준, 바람직한 행동?입니다.

  3. 내가 URL을 정의하지나요/UrlRoot에 제대로 또는 일부 등?

감사

+2

백본은 toJSON()의 결과를 정확하게 전송합니다. params.data = JSON.stringify (model.toJSON()); 속성 또는 뭔가 이상한 (로그에 낭비 가새가 있습니다). firebug에서 http 요청의 내용을 점검하여 누구를 비난해야하는지 확인하십시오. – Yaroslav

+0

나는 ... 그것은에서오고 어떤 생각을 지금은 최적화하는 데 필요한 이것은 독이되고 ... 잠시 동안 백본 및 레일이 같은 문제를 했어? – wulftone

+0

나는 내 경우에 (아마 당신도), 백본 비 중복 정보를 보내는 것으로 보인다 협조 할 것 같아요. Firebug는 내 서버로 보낸 POST 요청에 올바른 중복되지 않은 정보가 들어 있다고 말합니다. 그러나 루비 "params"로 바뀌기 전에 어딘가에 몇 가지 내용이 중복됩니다 ... 왜? – wulftone

답변

3

1 서버로 보낸 JSON 요소의 루트로 모델 이름을 포함하려면 toJSON 메서드를 재정의해야합니다.

toJSON: function() { 
    return { team: _.clone(this.attributes) } 
    }, 

이미이 방법을 망쳐 놓고 무시하고 있으므로이 방법을 사용하지 않는 이유는 없습니다.

2 이것은 매우 이상한 행동입니다. 시도 :

class Team < ActiveRecord::Base 
    self.include_root_in_json = false 
end 

아마도 Rails 중복 매개 변수 구문 분석을 제거합니다. Rails가 생성 된 JSON의 루트 요소로서 클라이언트에 클라이언트를 포함시키지 않는다는 이점이 있습니다.

3 urlRoot의 정의는 훌륭합니다.

+0

패치하지 않으면 작동하는 것으로 보입니다. 당신이'''save'''를 사용하는 경우'''{패치 : 사실은}'''다음 백본 ​​동기화 방법은 toJSON 메소드를 호출하는 대신 변경된 바인드합니다을 선호한다. –

0

같은 문제를 찾고있는 중에 여기 도착했습니다. 그래서 그것은 오래된 질문입니다. 나는 대답을 해줄만한 가치가 있다고 생각합니다.wrap_parameters

http://apidock.com/rails/v3.2.13/ActionController/ParamsWrapper/ClassMethods/wrap_parameters

그냥 빈 배열로 설정하고, 레일에 JSON 요청에서 오는 매개 변수를 포장하려고하지 않습니다

는 사실이 중복 속성을 설명 레일 설정을 발견했다.

0

다른 사람들이 언급 한 toJSON 핵을 사용할 수 있지만 실제로는 그렇게 좋은 생각은 아닙니다. 하나를 들어, sync{patch: true}save 사이에 일치하지 않는 결과를 생성합니다 (이 불일치는 패치하지 않으면 동기화 방법은 toJSON을 호출하기 때문에,하지만 당신은 참으로 패치 세트가있는 경우 toJSON를 호출하지 않습니다) 대신

을 더 나은 해결 방법은 동기화 방법 자체를 오버로드하는 백본의 패치 버전을 사용하는 것입니다. 백본 레일 젬은 이것을 자동으로 수행하거나 backbone_rails_sync.js를 자신의 앱으로 가져올 수 있습니다. 이 질문에 대한보다 완전한 대답은 다음에서 찾을 수 있습니다 : Backbone.js and Rails - How to handle params from Backbone models?

관련 문제