2013-02-13 23 views
2

還不知道到底要怎麼稱呼這個問題。仍然是新的鐵路。的Rails 3:循環顯示更多的記錄比應該

情況:一個拍賣包含很多地段
我展示像/拍賣/ 3 /手/一個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

我lots_controller看起來是這樣的:

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擺脫了額外的行,雖然現在我不能成功地創建批次。我不知道該怎麼做。我可能必須在lots_controller的索引方法中設置一些東西,但我不知道是什麼。

任何幫助表示讚賞。

+0

你是如何設置'@ lots'? – catsby 2013-02-13 20:16:51

+0

'@auction = Auction.find(params [:auction_id]) @lots = @ auctions.lots' – 2013-02-13 20:21:22

+0

它看起來像拍賣有很多的連接,並沒有指定很多的ID。我希望看到很多與拍賣有關的代碼。 – Kazetsukai 2013-02-13 20:36:07

回答

0

如果批次未能保存,這將發生在您的創建方法中。因爲您使用了@auction.lots.build,這爲拍賣添加了很多記錄。如果它沒有正確保存,它仍然沒有保存。這就解釋了爲什麼「神祕」一個沒有一個id,還爲什麼:

<%= @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剔除未保存的,但這有點奇怪。在這種情況下,正常的導軌事情是重新呈現帶有顯示驗證錯誤的表單,並要求用戶修復它們並嘗試再次創建。

+0

只有在發出'POST'請求時纔會出現這種情況。如果你只是去'/ auction/3/lots',它不會觸及'create'動作。如果他從'index'得到這個行爲,那麼我認爲我們需要看到他的模型代碼定義了兩個模型及其關聯。 – nzifnab 2013-02-13 21:06:42

+0

哦,從失敗的保存*中提取動作:'index'''因爲他只定義了一個'@ lot'變量,所以'@ lots'不會存在。 (它會給他一個錯誤'未定義的方法'每個'零:NilClass') – nzifnab 2013-02-13 21:08:05

+0

都好點。我同意我們需要查看更多代碼才能看到究竟發生了什麼。但我堅持基本的前提 - 出於某種原因,數組中的額外元素必須是未保存的實例。 – 2013-02-13 21:11:52

-1

這應有助於:

def create 
    params[:lot].merge!({:auction_id => params[:auction_id]}) 
    @lot = Lot.new(params[:lot]) 

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

這實際上並沒有什麼幫助,那麼'render:action =>「index」'仍然會給出一個'未定義的方法'的錯誤,正如我在傑夫格蘭的答案中提到的。 OP的問題似乎與「索引」行爲有關,而不是「創建」行爲。 – nzifnab 2013-02-13 21:22:43

相關問題