2012-12-09 13 views
5

Używam ruby ​​na szynach i próbuję sprawdzić, czy zapytanie zwraca wartość, czy nie.ruby-on-rails sprawdź, czy wynik zapytania jest pusty (Model.find)

Jest to zapytanie:

@search = Customer.find_by_name($login_name) 

Jeśli zapytanie znajdzie wynik, wszystko jest w porządku, ale jak mogę zareagować na pustych wyników?

Próbowałem:

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

ale pojawia się błąd:

undefined method `empty?' for nil:NilClass 

jakieś pomysły, co poszło nie tak?

Dziękujemy!

Odpowiedz

20

Służy do sprawdzenia zera, a także pustych przypadkach:

@search.blank? 

W przeciwnym przypadku (NIE zera i nie jest pusty), należy .present?:

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

Powodem zapytanie zwróciło nil zamiast empty jest:

Customer.find_by_name($login_name) 

zawsze ret urny jeden wynik z przedmiotu Customer lub nil jeśli nie ma takiego wynik,

natomiast coś takiego:

Customer.where(:name=>$login_name) 

zwróci Ci ActiveRecord::Relation (który może mieć 0-n wyników) zawsze. i empty? metoda zadziała na nim

+0

Świetnie! Działa świetnie! Dziękuję Ci bardzo! – Tobi89

1

Jeśli nie zostanie znaleziony żaden wynik, find_by_name zwraca obiekt zerowy, a nie pustą tablicę. Aby sprawdzić, czy klient został znaleziony, możesz użyć if @search.nil? lub po prostu if [email protected] lub unless @search, ponieważ wartość nil jest falsy w rubinach.

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