2011-02-20 11 views
47

De acuerdo con save bang your head, active record will drive you mad, debemos evitar el uso de save! y rescue idioma para situaciones excepcionales. Dado que, digamos que un modelo necesita @post.mark_rejected.Cuándo usar `save` vs` save! `En el modelo?

Si el código en mark_rejected falla debido a uno de los siguientes problemas, ¿debe producirse una excepción? :

  • si hay un problema de validación
  • si un no anulable-campo se está asignando un valor nulo
  • si había una pérdida de conexión a la base de datos

Si no tiramos una excepción, entonces:

  • acción del controlador tendría que comprobar si hay valor de retorno de mark_rejected y hacerlo es cosa
  • no esperamos una excepción de esa llamada al método, por lo que no escribimos una cláusula rescue en la acción del controlador, por lo tanto, la excepción sube hasta (... donde sea ...) y probablemente aparezca como algunos (500 HTTP ?) error

código Ejemplo:

def mark_rejected 
    ... 
    save! 
end 

o

def mark_rejected 
    ... 
    save 
end 
+4

@Zabba Aquí está el [código fuente y la documentación de 'guardar' y' guardar! '] (Https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb# L86). – JJD

Respuesta

18

hay más por encima en una excepción, por lo que no es un problema de rendimiento, especi aliado cuando se puede esperar que sea lanzado con frecuencia, como es el caso con save.

Hay menos líneas de código para verificar si el valor de retorno es falso que rescatar una excepción, por lo que no veo cómo es un problema tener que verificar el valor de retorno si ya tiene que rescatar la excepción. ¿Con qué frecuencia una excepción lanzada por save! alguna vez tendrá que hacer estallar la pila de llamadas en la práctica? Raramente, si es que alguna vez, en mi experiencia.

Si se produce una excepción al llamar al save en comparación con save!, debería mostrar una página de error 500 porque eso es lo que sucedió: un error irrecuperable, desconocido, inesperado del servidor interno.

+1

Gracias por toda su ayuda hoy. He leído un poco sobre excepciones ahora, y he llegado a la conclusión de que las excepciones no deberían usarse para el "control de flujo" , por así decirlo. Si hay una excepción, dejaré que suba la pila de llamadas y en su lugar escriba código de comprobación de valor para tratar los problemas. Por el momento, el enfoque parece ser la forma correcta de hacer estas cosas, aunque no estoy del todo seguro de las razones de . Oh bien. – Zabba

99

save! generará un error si no se realiza correctamente.

save devolverá el valor booleano como verdadero o falso.

+0

¿Cuál es el comando opuesto para guardar! Quiero decir, ¿cuál es el comando para eliminar al usuario? – user1903022

+0

'user.delete' y' user.eliminar' Se eliminará el usuario – Selvamani

+0

@Selvamani: user.remove? – ram

Cuestiones relacionadas