ActiveRecord查询结果中显示的额外记录

时间:2015-05-15 02:49:53

标签: ruby-on-rails activerecord

所以这就是问题所在:

我有一个页面,我想要显示“项目”列表。我还希望在此页面上添加一个用于添加其他“项目”的表单。

控制器中的“新”操作如下所示:

def new
  @collection = current_user.collections.find_by_id(params[:collection_id])
  @item_list = @collection.items
		
  @item = @collection.items.new
end

视图中的代码如下:

<div class="row-fluid">
  <div id="main_area" class="col-sm-offset-3 col-sm-6 col-md-offset-4 col-md-4">
    <div class="center">
      <h3><%= @collection.title %></h3>
      <% if @item_list.any? %>
        <ul>
          <% @item_list.each do |il| %>
            <li>
              <%=i l.name %>
                <% end %>
        </ul>
        <% end %>

          <div id="add_item">
            <%=f orm_for [@collection, @item] do |f| %>
              <div class="form-group <%= 'has-error has-feedback' if @item.errors[:name].present? %>">
                <label class="sr-only" for="item_name">Item Name</label>
                <%=f .text_field :name, :autofocus=>true, :placeholder => "Item Name", :class => "form-control", :'aria-describedBy' => "itemNameBlock" %>
                  <% if @collection.errors[:title].present? %>
                    <span id="itemNameBlock" class="error">Item <%= @item.errors[:name].first %></span>
                    <% end %>
              </div>
              <div id="signin_button_row">
                <%=f .submit "Save", :class=>"form-control green_button" %>
                  <span id="forgot_my_password" class="right-justify">
						<%= link_to "cancel", collection_items_path(@collection), :class => "new_colors terms" %>
					</span>
              </div>
              <% end %>
          </div>
    </div>
  </div>
</div>

我的问题是视图中的循环似乎总是有一个额外的'item',这似乎与我在控制器中使用'new'的事实有关。

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

这里的问题是,在构建模板Item对象时,您也要将它放到集合中,这不是您想要的。

对我来说,看起来有两种可能的解决办法:

  1. 输出列表时,请不要通过检查项目是否已保留来显示新项目:

    <ul>
      <% @item_list.reject(&:new?).each do |il| %>
        <li>
          <%= il.name %>
        </li>
      <% end %>
    </ul>
    
  2. 实际上不要将新模板项目添加到集合中,从概念的角度来看,这对我来说更有意义,因为您实际上并不需要将该项目与您的项目集合相关联渲染视图的重点,例如:

    class ItemsController < ApplicationController
    
      before_filter do
        @collection = collection.find(params[:collection_id])
        @items = @collection.items
      end
    
      def index
        @item = Item.new
      end
    
      def create
        @item = @items.new(item_params)
        if @item.save
          redirect_to  collection_items_path
        else
          render action: :index
        end
      end
    
      private
    
      def item_params
        params.require(:item).permit!
      end
    end
    
  3. 希望这有意义并且适合你!

答案 1 :(得分:1)

这会创建相同的项目,但不会将其添加到集合

def new
  @collection = current_user.collections.find_by_id(params[:collection_id])
  @item_list = @collection.items

  @item = Item.new collection_id: @collection.id
end