En mi aplicación, a veces creo un usuario sobre la marcha, y el correo electrónico de un usuario debe ser un formato válido y ser únicorails 3.1: cómo puede la aplicación manejar diferentes "razones" para ActiveRecord :: RecordInvalid (por ejemplo, duplicado vs error de validación)
Me gustaría redirigir a diferentes lugares según la validación que provocó el error: formato no válido frente a duplicado.
En mi código que tengo
begin
user.save!
flash[:notice] = "Created new user #{email} with password #{password}"
rescue ActiveRecord::RecordInvalid => e
flash[:alert] = "Failed to create account because #{e.message}"
redirect_to SOMEPLACE
end
Si el correo electrónico es un formato no válido (como "usuario @ ejemplo") e.Message es "Error de validación: El correo electrónico es inválida"
Si el correo electrónico ya existe en la tabla, e.message es "Validación fallida: el correo electrónico ya se ha tomado"
Odio la idea de analizar el texto de e.message para determinar el motivo ... ¿hay alguna manera mejor para un manejador de rescate? para detectar el motivo subyacente una excepción ActiveRecord :: RecordInvalid w como arrojado?
P.S. Sé en este ejemplo que puedo simplemente verificar el correo electrónico existente antes de hacer un guardado, pero estoy tratando de comprender la solución general para detectar y actuar sobre diferentes fallas de validación arrojando la misma excepción.
En realidad, no podemos simplemente verificar el correo electrónico ya existente, las validaciones de singularidad de ActiveRecord están sujetas a condiciones de carrera y no están definidas. Debe tener una restricción de exclusividad dentro de su base de datos y debe estar preparado para o tratar con la excepción que aumentará (ya sea de '.save' o' .save! '). –