Я пишу практическое приложение Backbone с API-интерфейсом Rails, и меня не устраивает поведение сохранения в моделях 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}
}
У меня есть несколько вопросов:
Как лучше всего убедиться, что атрибуты player_attributes вложены в корневой ключ? Я (чтобы я мог сделать вложенное сохранение внутри TeamController, в стандартной манере рельсов: (т.е. Team.create(params[:team])) я могу выполнить это с помощью некоторого хакерства javascript внутри toJSON, но я предполагаю, что проще и чище.
Является ли это стандартным, желательным поведением? Отправлять дубликаты атрибутов, подобные этому? Думаю, в этом нет ничего плохого, но это дурно пахнет.
Я неправильно определяю url/urlRoot или что-то в этом роде?
спасибо