我正在編寫一個練習骨幹應用程序,使用Rails後端API,我對保存在Backbone模型上的行爲感到困惑。爲什麼Backbone模型在保存時向服務器發送重複屬性?
假設一支球隊有很多球員,並且我希望在一個POST中保存一個擁有衆多球員的球隊。
所以在Rails的,我有:
class Team < ActiveRecord::Base
has_many :players
accepts_nested_attributes_for :players
end
class Player < ActiveRecod::Base
belongs_to :team
end
和骨幹網的客戶端,我有一個播放器模型和定義的玩家集合(未顯示)
,然後將含有組隊模式(注:無團隊集合)
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}
}
我有幾個問題:
什麼是保證嵌套在根密鑰內player_attributes的最佳方式?我(這樣我就可以在TeamController中以標準的rails方式進行嵌套保存:(即Team.create(params [:team]))我可以用一些javascript hackery在json中完成這項工作,但我猜測這裏有一個更簡單,更清潔的方式。
這是標準的,期望的行爲?要送這樣的屬性的重複?我想有沒有危害,但它沒有氣味的權利。
我不是定義URL/urlRoot正確或一些這樣?
感謝
主幹精確地發送toJSON()的結果:'params.data = JSON.stringify(model.toJSON());',所以無論你的模型包含這樣的屬性或者服務器上的一些奇怪的東西(日誌中有浪費的大括號)。檢查螢火蟲中的http請求內容,找出責任人。 – Yaroslav
我在Backbone和Rails上遇到了同樣的問題......現在我需要進行優化,這已經變得令人討厭......任何想法都來自哪裏? – wulftone
我認爲值得注意的是,就我而言(也可能是你的情況),骨幹似乎在發送非重複的信息。 Firebug告訴我發送給我的服務器的POST請求包含正確的,非重複的信息。然而,在它轉向紅寶石「params」之前,它重複了一些東西......爲什麼? – wulftone