dou*_*lea 9 javascript ruby ruby-on-rails nested-attributes backbone.js
我正在编写一个练习Backbone应用程序,使用Rails后端API,我对在Backbone模型上保存的行为感到困惑.
假设一个团队有很多玩家,我想在一个POST中保存一个拥有众多玩家的团队.
所以在Rails中我有:
class Team < ActiveRecord::Base
has_many :players
accepts_nested_attributes_for :players
end
class Player < ActiveRecod::Base
belongs_to :team
end
Run Code Online (Sandbox Code Playgroud)
对于骨干客户端,我有一个Player模型和一个Players集合定义(未显示)
然后是包含团队模型(注意:没有团队集合)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中检查我的字符串化JSON时,一切看起来都很好:
{"team_size":12, "players_attributes":[{"name":"Fred"},{"name":"Jim" },{"name":"Mark"}]}
Run Code Online (Sandbox Code Playgroud)
检查服务器日志,重复一次顶级属性('团队大小'),一次在顶层,然后在根密钥下重复.
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}
}
Run Code Online (Sandbox Code Playgroud)
我有几个问题:
确保player_attributes嵌套在根密钥中的最佳方法是什么?我(所以我可以在标准的rails方式中在TeamController中进行嵌套保存:(即Team.create(params [:team]))我可以用toJSON中的一些javascript hackery来完成这个,但我猜是有一个更简单,更清洁.
这是标准的,理想的行为吗?要发送像这样的重复属性?我想这没什么坏处,但它闻起来不对劲.
我没有正确定义url/urlRoot还是其他一些?
谢谢
1-您必须重写 toJSON 方法才能将模型名称作为发送到服务器的 JSON 元素的根包含在内。
toJSON: function() {
return { team: _.clone( this.attributes ) }
},
Run Code Online (Sandbox Code Playgroud)
既然你已经搞乱并覆盖了这个方法,我认为没有任何理由不走这条路。
2-这是你所描述的一种非常奇怪的行为。尝试:
class Team < ActiveRecord::Base
self.include_root_in_json = false
end
Run Code Online (Sandbox Code Playgroud)
它可能会消除 Rails 重复参数解析。从中获得的另一个优势是,Rails 不会将团队作为其生成的 JSON 的根元素包含到客户端。
3-你对 urlRoot 的定义很好。
归档时间: |
|
查看次数: |
1369 次 |
最近记录: |