Pregunta

Por lo tanto, sé que la distinción entre los métodos de Bang (marca de exclamación) y no bang generalmente es si el método modificará el objeto en sí o devolverá un objeto modificado separado que mantiene el original sin cambios.

Luego, al construir el modelo de usuario en el capítulo 6 del libro, me encontré con el User.create Método, que crea un nuevo modelo y lo guarda a la base de datos en un solo paso. En Michael Hartl's Ruby on Rails 3 Tutorial, él escribe que el User.create! método "funciona como el create método ... excepto que plantea un Activerecord :: Record-inválido excepción si la creación falla ".

Estoy bastante confundido. Es el User.create! El método no sigue a Ruby "Bang Convention" o me falta algo por completo? Y si está siguiendo la convención, ¿cómo es User.create! ¿Modificarse a sí mismo si es un método de clase?

¿Fue útil?

Solución

Aunque muchas clases tratan los métodos de Bang como "un método que modifica el objeto en su lugar", me gusta la descripción de los métodos de Bang de la Libro de rubí elocuente mejor:

En la práctica, los programadores de Ruby se reservan! adornar los nombres de los métodos que hacen algo inesperado, o tal vez un poco peligroso

Entonces, en este caso, el resultado "inesperado" es que se plantea una excepción en lugar de simplemente fallar y regresar false.

Otros consejos

Espero que esto también ayude:

Las versiones de Bang (¡por ejemplo, Guardar!) Aprovechan una excepción si el registro no es válido. Las versiones que no son de bang no: Guardar y update_attributes return false, crea y actualiza simplemente devolver los objetos.

Fuente: http://edgeguides.rubyonrails.org/active_record_validations.html#when-does-validation-happen-questionmark

Editar: Cambiado de fuente para arreglar el enlace roto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top