2011-10-07 8 views
13

Czy można używać funkcji jako get_by_id_or_404 na szynach. Dla exemple, w moim kontrolera używam:Pobierz model lub 404 na szynach

@destination = Destination.find_by_id(params[:id]) 

jeśli id ​​nie jest ustawiony lub przeznaczenia nie znaleziono, jak mogę zapytać Rails przekierować na 404 stronie?

Dziękujemy!

Odpowiedz

30

W trybie produkcyjnym Rails automatycznie ratuje wyjątek ActiveRecord::RecordNotFound przez renderowania strony 404 błędów.

Po prostu użyj wersji Bang of Finder, która podnosi ActiveRecord::RecordNotFound, gdy nie znaleziono żadnego wyniku.

@destination = Destination.find_by_id!(params[:id]) 

Jednak w twoim przypadku nie ma powodu, aby użyć metody find_by. Po prostu zamień na find.

@destination = Destination.find(params[:id]) 
1

myślę w produkcji, to podniesie błąd i wyświetla 404 ou 500.

+2

Jeśli nie zmienisz metody wyszukiwania, metoda ta nie wygeneruje żadnego wyjątku. –

4

To z the guide: (!)

Można określić wykrzyknik na końcu dynamiczne dystansu, aby je podnieść błąd ActiveRecord :: RecordNotFound jeśli nie zwraca żadnych rekordów, jak Client.find_by_name! („Ryan”)

Kiedy to nastąpi, zostanie Rails renderować strony 404 dla Ciebie. Również po prostu użyć find jako skrót dla find_by_id:

@destination = Destination.find!(params[:id]) 
+1

Nie trzeba wykrzyknika! Sprawdź [dokumenty dla 'find'] (http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i- find), to podniesie RecordNotFound, jeśli przekażesz mu id. – molf

+1

Sądzę, że chodziło Ci o to, że find jest skrótem do find_by_id! –