我正在尝试为世界杯预测建立一个游泳池系统。 在这里,我和团队一起玩游戏。我想列出它们并给它们预测字段。我有工作,只有分开。现在我想把它们结合起来。
在我的预测新视图中有以下代码:
<%= 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
答案 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 %>
顺便说一下,Prediction
和Poolmembership
之间的关系是错误的。它应该是:
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 %>
这不对。您应该显示下拉列表或用户可以在哪个池中选择他想要提交预测的内容。现在它总是提交到最后一个池。