2015-03-13 2 views
0

Я делаю простое приложение для распределения команд. У меня три модели - игроки, команды и раунды. Идея состоит в том, чтобы иметь список игроков, из которых пользователь может выбрать тех, кто на самом деле присутствует в день, чтобы играть в раунд. Пока у меня есть код, который принимает всех текущих игроков в db и случайным образом распределяет их в команде (команды создаются при создании раунда).Как принять атрибуты для моделей, не имеющих активной ассоциации записей?

class Player < ActiveRecord::Base 
    has_and_belongs_to_many :teams 
end 

class Team < ActiveRecord::Base 
    has_and_belongs_to_many :players 
    belongs_to :round 
end 

class Round < ActiveRecord::Base 
    has_many :teams 
end 

Я написал функцию, которая вызывается во время раунда, чтобы создавать и заполнять команды. Это нормально работает, но он просто получает входной список игроков от Player.all.

То, что я хотел бы в раундов/new.html.erb иметь что-то вроде этого:

<%= f.fields_for(@players) do |player| %> 
    <%= check_box_tag 'player_ids[]', player.id, true %> 
    <%= player.first_name %> <%= player.surname %> 
<% end %> 

Таким образом, на submit я могу обработать массив выбранных пользователей для этого раунда и только назначить эти игроки в команду. Я думал об использовании

accepts_nested_attributes_for :players 

в модели раундов, но это на самом деле не имеет (или необходимости) ассоциацию с игроками. Есть ли способ добиться этого или чего-то подобного? Должен ли я вместо этого настроить действие в контроллере игроков, который управляет просмотром/отправкой флажка, а затем сохраняет выбор пользователя в данных сеанса?

+0

создать 'Player.all_selected (params [: player_ids])' - что-то в этом роде. – iced

+0

Хей, вы можете сделать это очень просто с http://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-collection_check_boxes, для этого вам даже не требуется accepts_nested_attributes_for. Замените поля fields_for с помощью: '<% = f.collection_check_boxes: player_ids, Player.all,: id,: first_name%>' и обновите принятые параметры, чтобы включить 'player_ids: []' – cristian

+0

Можете ли вы объяснить использование 'player_ids 'как первый аргумент? Я пробовал то, что вы предложили @cristian, но я получаю ошибку 'undefined method 'player_ids''. Я также не уверен, как включить player_ids: array в params. Было бы просто 'def round_params params.require (: round) .permit (: name,: player_ids) end' – moleman

ответ

0

Если добавить следующий код в форму:

<% @players.each do |p| %> 
    <%= label_tag do %> 
    <%= check_box_tag 'players[]', p.id, false %> 
    <%= "#{p.first_name} #{p.surname}" %> 
    <% end %> 
<% end %> 

Тогда будет и массив идентификаторов в params[:players], а затем вы можете использовать комментарий от @iced.

Ваша модель не должна знать ничего о том, как вы приобрели эти идентификаторы, и это приятно из-за Separation of concerns.

Смежные вопросы