0

我只是想让我的表单为尚未创建的每个项目显示一个空白字段。我已经使用 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 %>

谢谢。

4

1 回答 1

0

回答我自己的问题,因为没有其他人这样做:我让方法 B 进行了非常小的调整。它所需要的只是“包含?”后面的值的括号,如下所示:

如果 team_ids.include?(team.id) == false。

我通过使用 rails 控制台中的每一行代码来解决这个问题。

方法 A 也可以工作,但由于我让方法 B 工作,我还没有尝试过。

更新:方法A也有效

于 2012-11-13T22:47:48.270 回答