2015-10-27 10 views
5

Der run-down. Eine Person kann viele Gebote haben, diese bestimmte Person hat nur ein Gebot.Undefinierte Methode jeder Ruby

In meinem Index Aktion habe ich @bids = Bid.find_by_person_id(params[:person_id])

meiner Meinung nach ich

<% @bids.each do |bid| %> 
    <%= bid.bid_amount %> 
<% end %> 

ich NoMethodError: undefined method each' for #<Bid:0x007f988a346f00> bin immer bei der Indexansicht zur Person Gebote Visting.

Liegt das daran, dass diese Person nur ein Gebot hat? Ich fühle, dass das nicht der Fall ist, aber anders als das im Verlust.

+0

Ich weiß, dass es nicht null ist. Ich debuggte, um zu verifizieren. – Seal

+0

können Sie nicht über einen einzigen Datensatz iterieren mein Freund – illusionist

Antwort

12

find_by gibt den ersten Artikel zurück. Ich glaube, Sie suchen nach

Bid.where(person_id: params[:person_id]) 
+0

ahhh ich denke, Sie haben Recht – Seal

+0

Guter Aufruf, ich werde akzeptieren, wenn ich kann. – Seal

2

Austio ist die Antwort richtig.

Doch warum rufen Sie das Bid Modell direkt? ...

Eine Person viele Gebote

Sie sind offenbar Daten aus dem Modell Person Konstruktion haben kann, so warum rufen Sie nicht die folgenden:

@person = Person.find params[:person_id] 
@bids = @person.bids #-> bids belong to @person 

Dies wird die Sammlung aufbauen, ohne Aufruf where.

Natürlich verwendet Ihre Methode nur eine einzige DB-Abfrage. Aber selbst das oben genannte ist viel intuitiver.

-

Als beiseite, Sie wollen auch vor der Schleife eine bedingte verwenden:

<% if @bids.any? %> 
    <% @bids.each.... %> 
<% end %> 

Mit ein Gebot in Ordnung ist, aber mit keine die verursachen Schleife, um einen Fehler auszuspucken. Das obige löst dieses Problem.

+0

Das ist nicht wahr: "Ein Gebot ist in Ordnung, aber wenn es keins gibt, wird die Schleife einen Fehler ausgeben." Wenn Sie 'each' auf eine leere Sammlung anwenden, wird kein Fehler ausgegeben. – Mischa

+0

Hat für mich immer dann, wenn ich es auf einer leeren Sammlung genannt habe. –

+0

Nein, tut es nicht. Angenommen: '@bids = Bid.where (: id => [nicht-existierende-id])' dann wirft dies keine Fehler: '@ bids.each {| bid | ...} '. – Mischa

Verwandte Themen