Rails 4 has_many通过显示页面上的编辑关联

时间:2013-12-03 10:43:35

标签: ruby-on-rails model-associations

我正在构建一个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| %>

1 个答案:

答案 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。我在最近的一个项目中使用过这种方法并且效果很好:

Nested forms: Part 1

Nested forms: Part 2