在每个循环中获取特定的id

时间:2014-05-19 11:42:32

标签: ruby ruby-on-rails-4

我正在尝试为世界杯预测建立一个游泳池系统。 在这里,我和团队一起玩游戏。我想列出它们并给它们预测字段。我有工作,只有分开。现在我想把它们结合起来。

在我的预测新视图中有以下代码:

<%= form_tag controller: :predictions, action: :create_multiple_predictions do %>
  <% @predictions.each_with_index do |prediction, index| %>
    <%= fields_for "predictions[#{index}]", prediction do |p| %>
      <% @pool.each do |pool| %>
      <%= p.hidden_field :poolmembership_id, :value => Poolmembership.find_by_user_id_and_pool_id(current_user.id, pool.id).id %>
      <% end %> 

      <%= p.label :prediction1, 'prediction 1' %>
      <%= p.number_field :prediction1 %>
      <%= p.label :prediction2, 'prediction 2' %>
      <%= p.number_field :prediction2 %>
    <% end %>
  <% end %>
  <%= submit_tag 'Sign In' %>
<% end %>   

我可以用这个列出我的所有游戏:

<% @game.each do |game| %>
  <tr>
    <td><%= Team.find(game.team1_id).name %></td>
    <td>                  
      <% if game.score1 == nil && game.score2 == nil %>
        x - x
      <% else %>
        <%= game.score1 %> - <%= game.score2 %>
      <% end %>
    </td>
  </tr>
<% end %>

现在的问题是放置game_id隐藏字段的位置。

<% @game.each do |game| %>
  <%= hidden_field_tag :game_id, :value => game.id %>
<% end %>

我不需要游戏信息的其他部分。只有game.id应该与表单一起提交。当我将它放在predictions.each循环中时,它可以工作,但随后它会选择表中的最后一个游戏ID,这是合乎逻辑的。 (如果你将游戏循环放在预测循环中,游戏循环将在他的循环结束时停止,这将放置游戏的最后一个ID。我将编辑问题。)

我需要的是一种将游戏信息与预测字段相结合的方法,以及最后一个用于所有不同预测字段的提交按钮。

如需帮助,请参阅我的预测控制器和一些型号信息。 (新的(2)应该是游戏或其他东西的数量,这只是为了让它起作用,每个游戏应该有一个prediction1和一个prediction2字段。)

def new  
  @pool = Pool.all
  @game = Game.all
  @predictions = Array.new(2) { Prediction.new }
end

def create
  @predictions = Prediction.new(prediction_params)
  if @prediction.save
    redirect_to predictions_path
  else
    render 'new'
  end
end

def create_multiple_predictions
  params[:predictions].each do |k,v|
  prediction = Prediction.new
  prediction.prediction1 = v['prediction1']
  prediction.prediction2 = v['prediction2']
  prediction.poolmembership_id = v['poolmembership_id']
  prediction.save      
end

模型之间的关系:

class Pool < ActiveRecord::Base
  has_many :poolmemberships
  has_many :users, through: :pool memberships

class Poolmembership < ActiveRecord::Base
  belongs_to :pool
  belongs_to :user
  validates_uniqueness_of :user_id, scope: [:pool_id]
  has_many :predictions

class Prediction < ActiveRecord::Base
  belongs_to :game
  has_one :poolmembership
end

class Game < ActiveRecord::Base
  has_many :teams
  has_many :predictions, :dependent => :destroy
end

1 个答案:

答案 0 :(得分:1)

你应该遍历所有游戏并为它们创建预测。我认为你只需要像这样定义@games

def new
  @games = Game.all
end

在表单中,您必须确保提交给控制器的predictions哈希中的键是唯一的。这可以这样做:

<%= form_tag controller: :predictions, action: :create_multiple_predictions do %>
  <% @games.each do |game| %>
    <%= fields_for "predictions[#{game.id}]", Prediction.new do |p| %>
      <%= p.label :prediction1, 'prediction 1' %>
      <%= p.number_field :prediction1 %>
      <%= p.label :prediction2, 'prediction 2' %>
      <%= p.number_field :prediction2 %>
      <%= p.hidden_field :game_id, :value => game.id %>
    <% end %>
  <% end %>
  <%= submit_tag %>
<% end %>

顺便说一下,PredictionPoolmembership之间的关系是错误的。它应该是:

Prediction belongs_to :poolmembership

Prediction has_one :pool membership

我不明白你在这里尝试做什么:

<% @pool.each do |pool| %>
  <%= p.hidden_field :poolmembership_id, :value => Poolmembership.find_by_user_id_and_pool_id(current_user.id, pool.id).id %>
<% end %>

这不对。您应该显示下拉列表或用户可以在哪个池中选择他想要提交预测的内容。现在它总是提交到最后一个池。