Сохранение модельных ассоциаций в контроллере - PullRequest
0 голосов
/ 05 октября 2010

У меня установлены следующие модели:

class Player < ActiveRecord::Base
  has_many :game_players
  has_many :games, :through => :game_players
end

class Game < ActiveRecord::Base
  has_many :game_players
  has_many :players, :through => :game_players 
end

class GamePlayer < ActiveRecord::Base
  belongs_to :game
  belongs_to :player
end

В каждой игре четыре игрока. Мне нужно некоторое руководство в контроллере для того, как будет выглядеть сохранение новой игры и ее 4 игроков в модели GamePlayer. Это то, что у меня есть в моем контроллере:

  # POST /games
  # POST /games.xml
  def create
    @game = Game.new(params[:game])

    respond_to do |format|
      if @game.save

        format.html { redirect_to(@game, :notice => 'Game was successfully created.') }
        format.xml  { render :xml => @game, :status => :created, :location => @game }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @game.errors, :status => :unprocessable_entity }
      end
    end
  end

Очевидно, что это только сохранение модели Game, но мне неясно, как создать и сохранить 4 игроков в GamePlayer. GamePlayer действительно должен иметь game_id и player_id с некоторыми дополнительными метаданными для каждой строки (например, кто играл в защите и т. Д.).

Любая помощь будет оценена.

В моей форме просмотра у меня есть следующее:

<%= form_for(@game) do |f| %>
  <% if @game.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@game.errors.count, "error") %> prohibited this game from being saved:</h2>

      <ul>
      <% @game.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :blue_score %> :
    <%= f.text_field :blue_score %><br />
    <%= f.label :white_score %> :
    <%= f.text_field :white_score %><br />


    <%= label_tag(:white_offense, "White Offense:") %>
    <%= select_tag "white_offense", options_from_collection_for_select(@players, "name", "id")
    <%= select_tag "white_defense", options_from_collection_for_select(@players, "name", "id")
    <%= select_tag "blue_offense", options_from_collection_for_select(@players, "name", "id")
    <%= select_tag "blue_defense", options_from_collection_for_select(@players, "name", "id")


    <%= submit_tag("New Game") %>


  </div>
<% end %>

1 Ответ

0 голосов
/ 06 октября 2010

Хотя я чувствую, что имеет , чтобы быть лучшим способом, чем этот (возможно, с использованием коллекций?), Вот мое решение:

<%= label_tag(:white_offense, "White Offense:") %>
<%= select_tag "white_offense", options_from_collection_for_select(@players, "id", "name") %>
<br />
<%= label_tag(:white_defense, "White Defense:") %>
<%= select_tag "white_defense", options_from_collection_for_select(@players, "id", "name") %>
<br />
<%= label_tag(:blue_offense, "Blue Offense:") %>
<%= select_tag "blue_offense", options_from_collection_for_select(@players, "id", "name") %>
<br />
<%= label_tag(:blue_defense, "Blue Defense:") %>
<%= select_tag "blue_defense", options_from_collection_for_select(@players, "id", "name") %>
<br />
<%= submit_tag("New Game") %>

И мой контроллер:

@game = Game.new(params[:game])
@game.game_players.build(:player_id => params[:white_offense])
@game.game_players.build(:player_id => params[:white_defense], :is_defender => 1)
@game.game_players.build(:player_id => params[:blue_offense], :is_blue => 1)
@game.game_players.build(:player_id => params[:blue_defense], :is_blue => 1, :is_defender => 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...