2011-02-20 16 views
47

In base a save bang your head, active record will drive you mad, dovremmo evitare di utilizzare l'idioma save! e rescue per situazioni eccezionali. Detto questo, supponiamo che un modello abbia bisogno di @post.mark_rejected.Quando usare `save` vs` save! `Nel modello?

Se il codice in mark_rejected non riesce a causa di uno dei seguenti problemi, è necessario generare un'eccezione? :

  • se c'è un problema di validazione
  • se un non-nullable-campo è stato viene assegnato un valore nullo
  • se ci fosse una perdita di connessione al database di

Se noi non gettiamo un'eccezione, quindi:

  • azione di controllo avrebbe dovuto controllare per valore di ritorno di mark_rejected e da fare è cosa
  • non ci aspettiamo un'eccezione da quella chiamata di metodo, quindi non scriviamo una clausola rescue nell'azione del controller, quindi l'eccezione bolle fino a (..wherever ..) e probabilmente verrà visualizzata come alcuni (500 HTTP ?) errore

codice Esempio:

def mark_rejected 
    ... 
    save! 
end 

o

def mark_rejected 
    ... 
    save 
end 
+4

@Zabba Ecco il [codice sorgente e la documentazione di 'save' e' save! '] (Https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb# L86). – JJD

risposta

18

c'è di più in testa in un'eccezione, per cui v'è un problema di prestazioni, especi alleato quando ci si può aspettare che venga gettato spesso, come nel caso di save.

Si tratta di un minor numero di linee di codice per verificare se il valore di ritorno è falso di salvare un'eccezione, quindi non vedo come si tratta di un problema di dover controllare il valore restituito se si dispone già di salvare l'eccezione. Con quale frequenza un'eccezione generata da save! deve mai creare una bolla nello stack di chiamate in pratica? Raramente, se mai, nella mia esperienza.

Se viene emessa un'eccezione quando si chiama save anziché save!, si consiglia di visualizzare una pagina di errore 500 perché è ciò che è accaduto: un errore interno irreversibile, sconosciuto, imprevisto del server interno.

+1

Grazie per tutto il tuo aiuto oggi. Ora ho letto un po 'sulle eccezioni e sono giunto alla conclusione che non si dovrebbero usare eccezioni per il controllo del flusso "per così dire". Se c'è un'eccezione, lascerò che bolla lo stack di chiamate e scriva invece il codice di controllo del valore per gestire i problemi. Al momento l'approccio sembra il modo giusto per fare queste cose, anche se non sono del tutto sicuro dei motivi. Oh bene. – Zabba

99

save! genera un errore se non riesce.

save restituirà il valore booleano come vero o falso.

+0

Qual è il comando opposto per il salvataggio! Voglio dire qual è il comando per eliminare l'utente? – user1903022

+0

'user.delete' e' utente.remove' Cancellerà l'utente – Selvamani

+0

@Selvamani: user.remove? – ram