gpt4 book ai didi

javascript - 为什么 Backbone 模型在保存时向服务器发送重复的属性?

转载 作者:数据小太阳 更新时间:2023-10-29 03:56:01 25 4
gpt4 key购买 nike

我正在使用 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

对于主干客户端,我定义了一个 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 嵌套在根键中的最佳方法是什么?我(这样我就可以在 TeamController 中以标准的 rails 方式进行嵌套保存:(即 Team.create(params[:team]) )我可以使用 toJSON 中的一些 javascript 黑客来完成此操作,但我猜有一个更简单、更清洁的方式。

  2. 这是标准的、理想的行为吗?要发送这样的属性副本?我想没有什么害处,但闻起来不对劲。

  3. 我是不是没有正确定义 url/urlRoot 之类的东西?

谢谢

最佳答案

1- 您必须重写 toJSON 方法,以便将模型名称包含为发送到服务器的 JSON 元素的根。

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

由于您已经搞砸并重写了这个方法,我看不出有任何理由不这样做。

2- 您描述的是一种非常奇怪的行为。尝试:

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

它可能会消除 Rails 重复的参数解析。您从中获得的另一个优势是 Rails 不会将团队作为其生成的 JSON 的根元素包含在客户端中。

3- 您对 urlRoot 的定义很好。

关于javascript - 为什么 Backbone 模型在保存时向服务器发送重复的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10937106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com