2012-12-09 16 views
5

Ich verwende Ruby auf Schienen und versuche zu überprüfen, ob eine Abfrage einen Wert zurückgibt oder nicht.ruby-on-rails Prüfen, ob das Abfrageergebnis leer ist (Model.find)

Dies ist die Abfrage:

@search = Customer.find_by_name($login_name) 

Wenn die Abfrage ein Ergebnis findet, ist alles in Ordnung, aber wie kann ich reagieren auf leere Ergebnisse?

Ich habe versucht:

if @search.empty? 
    flash[:notice] = 'Username nicht bekannt' 
    redirect_to :action => :login 
end 

Aber ich erhalte eine Fehlermeldung:

undefined method `empty?' for nil:NilClass 

Irgendwelche Ideen, was falsch gelaufen ist?

Danke !!!

Antwort

20

verwenden sowie leere Fälle für null zu überprüfen:

@search.blank? 

Für den entgegengesetzten Fall (nicht Null und nicht leer), verwenden .present?:

@search.present? #equivalent of [email protected]? 

Der Grund Ihrer Abfrage zurückgegeben nil statt empty ist:

Customer.find_by_name($login_name) 

immer ret Urnen ein Ergebnis von Objekt Customer oder nil wenn es kein solches Ergebnis ist,

während so etwas wie:

Customer.where(:name=>$login_name) 

kehren Sie ActiveRecord::Relation (welche 0-n Ergebnisse haben kann) immer. und empty? Methode wird daran arbeiten

+0

Großartig! Funktioniert perfekt! vielen Dank! – Tobi89

1

Wenn kein Ergebnis gefunden wird, gibt find_by_name ein Nil-Objekt zurück, anstatt ein leeres Array. Um zu überprüfen, ob ein Kunde gefunden wurde, können Sie if @search.nil? oder einfach if [email protected] oder unless @search verwenden, da nil in Ruby falsch ist.

@search = Customer.find_by_name($login_name) 
unless @search 
    flash[:notice] = 'Username nicht bekannt' 
    redirect_to :action => :login 
end