まだ作成されていない各アイテムの空白のフィールドをフォームに表示しようとしています。より単純なフォームの build メソッドを使用してこれを成功させましたが、この場合の方法がわかりません。これを行うために使用している戦略は間違っていますか、それとも単純な構文ミスを犯していますか?
基本的なモデルのセットアップは次のとおりです。
コンプには多くのラウンドと多くのチームがあります。ラウンドには多くのアイテムがあります。各チームはラウンドごとに 1 つのアイテムしか持っていません
そのため、フォームが読み込まれたときに、チームがまだアイテムを作成していない場合は、そのチーム用に空白のアイテムを作成して、フォームに表示され、そのチーム用に編集できるようにします。
コントローラーで2つの異なる方法を試しましたが、どちらも機能しませんでした:
方法 1:
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
方法 2:
基本的には同じですが、ページが読み込まれる前に実行するメソッドを定義しました。
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 %>
ありがとう。