0

まだ作成されていない各アイテムの空白のフィールドをフォームに表示しようとしています。より単純なフォームの 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 %>

ありがとう。

4

1 に答える 1

0

他の誰もしなかったので、私自身の質問に答えます。方法 B を非常にわずかな調整で動作させることができました。必要なのは、次のように、「include?」の後の値を括弧で囲むことだけでした。

team_ids.include?(team.id) == false の場合。

これは、Rails コンソールでコードの各行をいじってみることでわかりました。

方法 A も同様に機能する可能性がありますが、方法 B が機能するようになったため、まだ試していません。

更新:方法Aも機能します

于 2012-11-13T22:47:48.270 に答える