不知道该怎么称呼这个问题对rails来说还是个新手。
情况:一场拍卖会有很多拍品。
我在一个类似/auction s/3/lots/的url中展示了一个拍卖的批。
视图:

<ul>
<% @lots.each do |lot| %>
  <li><%= lot.auction_id %>: <%= lot.id %></li>
<% end %>
</ul>

输出:
<ul>
  <li>3: 1</li>
  <li>3: </li>
</ul>

我的数据库里只有一个不确定额外的循环实例来自何处。
不管我在看哪一场拍卖,这都会发生在任何一个挂牌上。
也,
<%= @lots.length %>显示2
<%= @lots.size %>显示2
<%= @lots.count %>显示1
我的遥控器是这样的:
def index
  @auction = Auction.find(params[:auction_id])
  @lots = @auction.lots
end

def create
  @auction = Auction.find(params[:auction_id])
  @lot = @auction.lots.build(params[:lot])

  if @lot.save
    redirect_to auction_lots_path, :notice => 'Lot was successfully created.'
  else
    render :action => "index"
  end
end

我的模型:
class Auction < ActiveRecord::Base
  ...
  has_many :lots
end

class Lot < ActiveRecord::Base
  belongs_to :auction
  ...
end

...s只是attr_accesssiblevalidates行。
我点击页面时的日志是被请求的,在这里。
Started GET "/auctions/8/lots" for 127.0.0.1 at 2013-02-13 16:35:51 -0500
Processing by LotsController#index as HTML
  Parameters: {"auction_id"=>"8"}
  Auction Load (0.1ms)  SELECT "auctions".* FROM "auctions" WHERE "auctions"."id" = ? LIMIT 1  [["id", "8"]]
  Lot Load (0.2ms)  SELECT "lots".* FROM "lots" WHERE "lots"."auction_id" = 8
[#<Lot id: 18, description: "1923 Morgan", lot_number: 1, auction_id: 8, created_at: "2013-02-13 17:20:04", updated_at: "2013-02-13 17:20:04">]
  Rendered layouts/_messages.html.erb (0.1ms)
  Lot Exists (0.2ms)  SELECT 1 AS one FROM "lots" WHERE "lots"."auction_id" = 8 LIMIT 1
  Rendered lots/index.html.erb within layouts/application (9.4ms)
Completed 200 OK in 21ms (Views: 17.8ms | ActiveRecord: 0.5ms)

更新:
有人说我好像在某个地方使用@auction.lots.build
是的,我是我有一个表格在同一页(索引),我可以添加很多。
<%= form_for(@auction.lots.build, :url => auction_lots_path(@auction)) do |f| %>
  ...
<% end %>

更改@auction.lots.build去掉了多余的行,尽管现在我不能成功地创建很多行我不知道该怎么办。我可能需要在lot_控制器的索引方法中设置一些内容,但我不知道是什么。
如有任何帮助,我们将不胜感激。

最佳答案

如果批保存失败,则在创建方法中会发生这种情况因为您使用了@auction.lots.build,所以这会给拍卖附加很多记录。如果保存不好,它仍然没有保存。这就解释了为什么“神秘”的人没有身份证,也解释了为什么:
<%= @lots.size %>显示2
<%= @lots.count %>显示1
@lots.count是一个数据库查询,但@lots.size只是内存中数组的大小。
我可能会在创建操作中做类似的操作:

def create
  @auction = Auction.find(params[:auction_id])
  @lot = @auction.lots.create!(params[:lot])
  redirect_to auction_lots_path, :notice => 'Lot was successfully created.'
rescue ActiveRecord::RecordInvalid
  render :action => "index"
end

... 当然,其他人更喜欢使用if/else,而不是挽救异常还有其他办法你可以做@auction.reload.lots来剔除未保存的,但这有点麻烦。在这种情况下,通常rails要做的事情是在显示验证错误的情况下重新呈现表单,并要求用户修复这些错误,然后再次尝试创建。

09-25 19:21