2016-06-21 12 views
1

Ich bekomme einen Null-Klassenfehler. Ich verstehe genau, was dieser Fehler mir sagt, aber ich weiß nicht, warum es Null ist. Es scheint mir, dass ein Gegenstand an meinen Tisch gelangen sollte. Dies sollte leicht zu debuggen sein. Hier ist mein Code für Klarheit.undefinierte Methode `each 'für Null: NilClass - Rails

Controller-Methode:

def info 
    @subscriber = Subscriber.find_by_phone_number(params[:phone_number]) 
end 

VIEW:

<% @subscriber.each do |subscriber| %> 
    <tr> 
    <td><%= image_tag avatar_url(subscriber) %></td> 
    </tr> 
<% end %> 

ERROR:

Showing /Users/intern/Desktop/Rails/rowster/app/views/subscribers/info.html.erb where line #3 raised: 
undefined method `each' for nil:NilClass 

Bindung an info Methode:

[1] pry(#<SubscribersController>)> @subscriber 
=> nil 

lassen Sie mich wissen, wenn Sie mehr Informationen benötigen?

+0

Haben Sie 'info' vor dem Code hier ausgeführt? Andernfalls würde '@ subscriber' nicht initialisiert werden. –

+0

Sorry, was meinst du mit "run' info' "? Ich ein bisschen neu zu all dem, so vermisse ich dumme Dinge immer noch – Bitwise

+0

können Sie zwei Debugs auf Ihre Info-Methode hinzufügen? unterhalb der bestehenden Zeile logger.debug @subscriber und logger.debug params. Edit mit der Ausgabe –

Antwort

6

Sie haben zwei Probleme hier:

Erstens: @subscriber.each schlägt mit undefined method 'each' for nil:NilClass. Dies sagt Ihnen im Grunde, dass Sie versuchen, each in etwas zu rufen, das nil ist, deshalb muss @subscribernil sein. Das bedeutet Subscriber.find_by_phone_number(params[:phone_number]) hat keinen Abonnenten zurückgegeben. Die an den Server gesendete Telefonnummer enthält keinen übereinstimmenden Eintrag in der Datenbank.

Zweitens: Selbst wenn es einen passenden Eintrag in der Datenbank gäbe, würde Ihr Code fehlschlagen. Denn find_by_phone_number würde einen Abonnenten und kein Array zurückgeben. Daher würde das Aufrufen von each erneut fehlschlagen.

beide Fragen Sie den Code ändern, um zu lösen:

<% if @subscriber %> 
    <tr> 
    <td><%= image_tag avatar_url(@subscriber) %></td> 
    </tr> 
<% else %> 
    <tr><td>No subscriber found!</td></tr> 
<% end %> 

und eine Telefonnummer verwenden, die in der Datenbank ist.

+0

Stellen Sie das 'if' mit <% else %>. –

+0

Danke nochmal @spickermannn – Bitwise

+0

@gen: Danke, fertig. – spickermann

Verwandte Themen