Qual è il modo corretto per salvare un'eccezione e continuare semplicemente l'elaborazione? Ho un'app che ha cartelle e articoli, con una relazione habtm attraverso una tabella di join chiamata folders_items. Quella tabella ha un vincolo univoco che garantisce che non ci siano combinazioni di voci/cartelle duplicate. Se l'utente tenta di aggiungere un elemento alla stessa cartella più volte, ovviamente non voglio aggiungere le righe aggiuntive; ma non voglio interrompere l'elaborazione, neanche.Rails 3 ignora l'eccezione di limitazione di Postgres
Postgres lancia automaticamente un'eccezione quando il vincolo univoco è violato, così ho cercato di ignorarlo nel controller come segue:
rescue PG::Error, :with => :do_nothing
def do_nothing
end
Questo funziona bene sui singoli inserimenti. Il controller esegue il rendering con un codice di stato di 200. Tuttavia, ho un altro metodo che fa gli inserimenti di massa in un ciclo. In quel metodo, il controller esce dal ciclo quando incontra la prima riga duplicata, che non è quello che voglio. In un primo momento, ho pensato che il ciclo dovesse essere incapsulato in una transazione che si stava riavvolgendo, ma non lo è - tutte le righe precedenti al duplicato vengono inserite. Voglio semplicemente ignorare l'eccezione del vincolo e passare all'elemento successivo. Come posso evitare che l'eccezione PG :: Error interrompa questo?
Grazie, mu. Sembra che abbia funzionato. Ho provato a incorporare "next" nel metodo do_nothing chiamato rescue_with, ma questo mi ha dato un errore. In ogni caso, è sicuramente un errore PG :: e non sto parlando direttamente al db. È solo una semplice tabella di join di habtm senza inserto SQL personalizzato. Forse ActiveRecord :: RecordNotUnique viene chiamato solo sulle tabelle dei modelli? –
Ho parlato troppo presto. Testato di nuovo e definitivamente sta ancora terminando il ciclo sul primo duplicato che incontra. La cosa interessante è che se inserisco il blocco begin/rescue nel metodo controller e rimuoviamo il rescue_with dal controller, allora l'eccezione non viene catturata affatto. Quindi, per qualche ragione, apparentemente questo non è catturato a livello del metodo del controller. –
Non vuoi prenderlo a livello di controller, è troppo lontano da dove puoi fare qualcosa sull'eccezione. Com'è il tuo codice? –