9

Rails バックエンド API を使用して練習用のバックボーン アプリを作成していますが、バックボーン モデルの保存の動作について混乱しています。

チームに多くのプレイヤーがいて、多数のプレイヤーがいるチームを 1 回の POST で保存したいとします。

したがって、Rails には次のようなものがあります。

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

class Player < ActiveRecod::Base
  belongs_to :team
end

バックボーン クライアントの場合、Player モデルと Players コレクションが定義されています (表示されていません)。

次に、それを含む Team モデル (注: Teams コレクションはありません)

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;  
  }
}

ブラウザーで文字列化された JSON を調べると、すべて問題ないように見えます。

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

サーバー ログを確認すると、唯一の最上位属性 (「チーム サイズ」) が最上位で一度繰り返され、次にルート キーの下で繰り返されます。

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}
  }

いくつかの質問を聞きたいんです:

  1. player_attributes がルート キー内にネストされていることを確認する最善の方法は何ですか? I (標準的なレールの方法で、TeamController 内でネストされた保存を実行できるようにするため: (つまり、Team.create(params[:team]))より簡単でクリーンな方法。

  2. これは標準的で望ましい動作ですか? このような属性の複製を送信するには? 害はないと思いますが、匂いがしません。

  3. url / urlRoot を正しく定義していませんか?

ありがとう

4

3 に答える 3

3

1-サーバーに送信されるJSON要素のルートとしてモデル名を含めるには、toJSONメソッドをオーバーライドする必要があります。

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

あなたはすでにこのメソッドを台無しにしてオーバーライドしているので、この方法を使わない理由はわかりません。

2-これはあなたが説明している非常に奇妙な振る舞いです。試す:

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

これにより、Railsの重複するパラメーターの解析がおそらく排除されます。これから得られるもう1つの利点は、Railsが生成されたJSONのルート要素としてチームをクライアントに含めないことです。

3-urlRootの定義は問題ありません。

于 2012-09-22T07:00:23.480 に答える
0

同じ問題を探しているときにここにたどり着きました。ですから、それは古い質問でも、答えを出す価値があると思います.

これらの重複する属性を説明するRails設定を実際に見つけました:wrap_parameters

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

空の配列に設定するだけで、レールは JSON リクエストからのパラメーターをラップしようとしません。

于 2013-09-27T22:27:09.413 に答える