我只是想让我的表单为尚未创建的每个项目显示一个空白字段。我已经使用 build 方法成功完成了更简单的表单,但我不知道如何在这种情况下做到这一点。我用来做这件事的策略是错误的还是我犯了一个简单的语法错误?
这是基本的模型设置:
比赛有许多回合和许多团队。一轮有许多项目。每队每轮只有 1 件物品
因此,当加载表单时,如果团队尚未创建项目,我希望为该团队创建一个空白项目,以便它显示在表单中并且可以为该团队进行编辑。
我在控制器中尝试了 2 种不同的方法,但都没有奏效:
方法一:
def edit_admin
@comp = Comp.find(params[:comp_id])
@round = @comp.rounds.find(params[:round_id])
team_ids = @round.items.all(:select => :team_id).collect(&:team_id)
@comp.teams.each do |team|
if team_ids.include? team.id == false
new_item = @round.items.new(:team_id => team.id, :round_id => @round.id)
new_item.save
end
end
end
def update_admin
@comp = Comp.find(params[:comp_id])
@round = @comp.rounds.find(params[:round_id])
if @round.update_attributes(params[:round])
redirect_to(edit_comp_path(@comp))
else
render 'edit_admin'
end
end
方法二:
本质上是一样的,但我定义了一个在页面加载之前运行的方法:
before_filter :build_new_items, :only => :edit_admin
private
def build_new_items
@comp = Comp.find(params[:comp_id])
@round = @comp.rounds.find(params[:round_id])
team_ids = @round.items.all(:select => :team_id).collect(&:team_id)
@comp.teams.each do |team|
if team_ids.include? team.id == false
new_item = @round.items.new(:team_id => team.id, :round_id => @round.id)
new_item.save
end
end
end
表单如下所示(视图名为 edit_admin.html.erb):
<%= form_tag update_admin_comp_round_items_path(@comp,@round), :method => :put do %>
<% for item in @round.items.all %>
<%= "Team: " + @comp.teams.find(item.team_id).team_name %> <br />
<%= fields_for 'round[items_attributes][]', item do |f| %>
<%= f.label :item_name %>
<%= f.text_field :item_name %> <br />
<%= f.hidden_field :id, :value => item.id %> <br />
<% end %>
<% end %>
<p><%= submit_tag "Submit" %></p>
<% end %>
谢谢。