Jaki jest poprawny sposób na uratowanie wyjątku i po prostu kontynuować przetwarzanie? Mam aplikację, która zawiera foldery i elementy, ze związkiem habtm poprzez tabelę dołączeń o nazwie folders_items. Ta tabela ma wyjątkowe ograniczenie, dzięki czemu nie ma duplikatów kombinacji elementów/folderów. Jeśli użytkownik spróbuje dodać element do tego samego folderu kilka razy, oczywiście nie chcę dodawać kolejnych wierszy; ale nie chcę też przerwać przetwarzania.Rails 3 zignorować wyjątek wyjątek wyjątek Postgres
Postgres automatycznie zgłasza wyjątek, gdy UNIQUE jest naruszona, więc starałem się ignorować go w sterowniku, co następuje:
rescue PG::Error, :with => :do_nothing
def do_nothing
end
Działa to dobrze na pojedynczych wstawek. Kontroler wykonuje render z kodem statusu równym 200. Mam jednak inną metodę, która wstawia masę w pętlę. W tej metodzie kontroler opuszcza pętlę, gdy napotyka pierwszy zduplikowany wiersz, co nie jest tym, czego chcę. Na początku myślałem, że pętla musi być zawijana w transakcji, która jest wycofywana, ale tak nie jest - wszystkie wiersze przed wstawieniem duplikatu. Chcę po prostu zignorować wyjątek ograniczenia i przejść do następnego elementu. Jak zapobiec temu wyjątkowi PG :: Error?
Dzięki, mu. Wygląda na to, że zadziałało. Próbowałem osadzania "next" w metodzie do_nothing, o której mowa, rescue_with, ale to dało mi błąd. W każdym razie na pewno jest to błąd PG :: i nie mówię bezpośrednio do bazy danych. Jest to po prostu zwykła stara tabela dołączania habtmu bez niestandardowej wstawki SQL. Być może ActiveRecord :: RecordNotUnique jest wywoływany tylko na tabelach modeli? –
Za wcześnie rozmawiałem. Przetestowałem to ponownie i na pewno wciąż kończę pętlę pierwszego napotkanego duplikatu. Interesujące jest to, że jeśli wstawię blok begin/rescue w metodzie kontrolera i wyjmę rescue_with ze sterownika, to wyjątek nie zostanie w ogóle złapany. Tak więc, z jakiegoś powodu, najwyraźniej nie jest to na poziomie metody kontrolera. –
Nie chcesz przechwytywać go na poziomie kontrolera, który jest zbyt daleko od miejsca, w którym można coś zrobić z wyjątkiem. Jak wygląda twój kod? –