我正在构建一个Rails 4应用程序,其中我有2个模型,1个用于关联:
game.rb
class Game < ActiveRecord::Base
has_many :participations
has_many :players, :through => :participations
accepts_nested_attributes_for :participations, :allow_destroy => true
accepts_nested_attributes_for :players
end
player.rb
class Player < ActiveRecord::Base
validates :name, presence: true, uniqueness: true
has_many :participations
has_many :games, :through => :participations
accepts_nested_attributes_for :participations, :allow_destroy => true
accepts_nested_attributes_for :games
end
participation.rb
class Participation < ActiveRecord::Base
belongs_to :player
belongs_to :game
accepts_nested_attributes_for :game
end
这个想法是,几乎每天都会玩游戏,玩家可以获得每个游戏的分数(这在参与模型中保留)。
如果我去游戏页面选择游戏,看到参与该游戏的所有玩家及其分数,一切正常。
我似乎无法做的是能够在游戏节目页面上添加玩家及其分数。 在与玩家的列表之后,想要一个带有选择器的表单(玩家名称可供选择)和一个文本框来输入分数。
如果可以使用Ajax完成它会更好。
任何帮助都将不胜感激。
更新
我在节目视图中显示了播放器及其分数:
<% @game.participations.each do |participation| %>
<tr>
<td><%= participation.player.name %></td>
<td><%= participation.score %></td>
<td><%= participation.time %></td>
</tr>
<% end %>
更新2
所以我得到了一些工作我的游戏#显示页面看起来像这样:
<p id="notice"><%= notice %></p>
<p>
<strong>Date:</strong>
<%= @game.date %>
</p>
<p>
<strong>Time:</strong>
<%= @game.time %>
</p>
<%= link_to 'Edit', edit_game_path(@game) %> |
<%= link_to 'Back', games_path %>
<hr>
<h4>Players</h4>
<hr>
<table class="table table-condensed">
<thead>
<tr>
<th>Player</th>
<th>Score</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<% @game.participations.each do |participation| %>
<tr>
<td><%= participation.player.name %></td>
<td><%= participation.score %></td>
<td><%= participation.time %></td>
</tr>
<% end %>
</tbody>
</table>
<%= form_for :participation, :url => participations_path, :html => {:method => :post} do |f| %>
<table>
<tr>
<td><%= f.collection_select :player_id, Player.all, :id, :name %></td>
<td><%= f.text_field :score %></td>
<td><%= f.text_field :time %></td>
</tr>
</table>
<%= f.submit %>
<% end %>
现在一切正常但是我如何将game_id传递给表单,因为我在游戏#show视图中我有@ game.id我试过这样的东西但不起作用:
<%= form_for :participation, :url => participations_path, :html => {:method => :post}, :game_id => @game.id do |f| %>
答案 0 :(得分:0)
你的关联混乱了。当你设置has_many时,:through =&gt;关联模型需要关联模型 - 在您的情况下'参与'。
它仅作为链接使用@ game.participations无法直接查看所有游戏。你需要引用其他模型,所以在你的情况下@ game.players。例如:
<% @game.players.each do |player| %>
<tr>
<td><%= player.name %></td>
<td><%= player.score %></td>
<td><%= player.time %></td>
</tr>
<% end %>
此外,“参与”所需的嵌套属性方法不,它只是一个链接模型:
accepts_nested_attributes_for :participations, :allow_destroy => true
<强>更新强>
如果您想知道如何为AJAX添加has_many关联的字段,我建议您查看这两个Railscast。我在最近的一个项目中使用过这种方法并且效果很好: