所以这就是问题所在:
我有一个页面,我想要显示“项目”列表。我还希望在此页面上添加一个用于添加其他“项目”的表单。
控制器中的“新”操作如下所示:
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'的事实有关。
如何解决这个问题?
答案 0 :(得分:1)
这里的问题是,在构建模板Item对象时,您也要将它放到集合中,这不是您想要的。
对我来说,看起来有两种可能的解决办法:
输出列表时,请不要通过检查项目是否已保留来显示新项目:
<ul>
<% @item_list.reject(&:new?).each do |il| %>
<li>
<%= il.name %>
</li>
<% end %>
</ul>
实际上不要将新模板项目添加到集合中,从概念的角度来看,这对我来说更有意义,因为您实际上并不需要将该项目与您的项目集合相关联渲染视图的重点,例如:
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
希望这有意义并且适合你!
答案 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