2010-10-11 9 views
18

w moim kontrolera uprawnień, używam Active Record szukać zgody:Rails 3 - Jak Nie błąd, jeśli nie znaleziono rekordu

@permission = Permission.find(params[:user_id]) 

Jeśli ta zwraca wynik I wtedy zajrzeć do zgody. imię i podaj to mojemu kontrolerowi.

Problem jest czasami taki, że nie powraca do skutku, w innych przypadkach go nie ma. Kiedy nie, to błędy. Jak mogę temu zapobiec?

Przypadek użycia: 1. Jeśli użytkownik ma rekord uprawnień, pokaż go i pozwól użytkownikowi go zmienić 2. Jeśli nie, pokaż, że nie ma zapisu pozwolenia i zezwól użytkownikowi na ustawienie zezwolenia .

Dzięki

Odpowiedz

46
@permission = Permission.find_by_id params[:user_id] 

Chodzi o to, że jeśli używasz „pierwszy param jest id” wersja znaleźć, wiesz dokładnie, czego szukasz, a jeśli go tam nie ma, to jest to problem . Jeśli użyjesz jednej z bardziej ogólnych składni wyszukiwawczych (takich jak find_by_field_name), założeniem jest, że jeśli jej tam nie ma, jest to sytuacja dopuszczalna, więc po prostu zwróć zero.

+2

'@permission = Permission.find_by (id: params [: user_id])' teraz. – hlcs

-8

myślę, że to będzie działać, ja jej nie testowane.

if @permission 
    # Handle when the permission exists 
else 
    # Handle when the permission doesn't exist 
end 
+1

'ActiveRecord # find' z parametrem int jest poszukiwanym celem. Railsy podnoszą 'RecordNotFound', jeśli rekord nie zostanie znaleziony. Różni się to od używania 'find' z parametrami takimi jak': first' lub ': all', który jest raczej wyszukiwaniem; Railsy zwracają zero w przypadku braku rekordów w tych przypadkach. (-1 dla niepoprawnych informacji i nie testowania) –

3

ActiveRecord#find z parametrem int jest celem wyszukiwania. Railsy podnoszą RecordNotFound, jeśli rekord nie zostanie znaleziony.

Różni się to od używania find z parametrami takimi jak :first lub :all, który jest bardziej wyszukiwany; Railsy zwracają zero w przypadku braku rekordów w tych przypadkach. Jeśli chcesz uniknąć zgłaszania wyjątku, użyj jednej z tych opcji lub odpowiednich nazw metod.

Przykład:

@permission = Permission.find(:first, :id => params[:id]) 
+0

Ach, zapomniałem o 'find_by_ [kolumnie]'. Zamiast tego użyj tego (patrz odpowiedź Matta Briggsa). Może być nieco wolniejszy z powodu 'method_missing', ale jest bardziej intuicyjny. –

2

Drugi sposób:

@permission = Permission.find_all_by_id params[:user_id]

Myślę, że to przydatne, jeśli user_id jest tablicą

+2

Zauważ, że 'find_all_by_ *' będzie przestarzałe w Rails 4. – clem

9

wiem, że to jest stary, ale ja po prostu znaleźć to i chcę zaproponować inny sposób radzenia sobie z tą sytuacją. ActiveRecord::RecordNotFound nie należy się obawiać. Użytkownik może przekazać prawidłowy identyfikator rekordu, ale ten rekord może nie należeć do nich (to znaczy, jeśli robisz coś takiego jak current_user.widgets.find(params[:id])). Preferuję obsłużyć go w ten sposób:

def show 
    begin 
    @permission = Permission.find(params[:user_id]) 
    rescue ActiveRecord::RecordNotFound 
    # however you want to respond to it 
    end 
end 
+2

Generalnie nie jest dobrym pomysłem testowanie przez błąd, ale dałem ci uprowadzenie do pokazania alternatywnego sposobu robienia tego. –

Powiązane problemy