ruby on rails - formularios - ¿No puedes saltarte la validación en Rails 3?
ruby on rails course (4)
Solo para emergencias
Suponiendo que haya considerado esto con mucho cuidado y esté seguro de que es una buena idea, puede guardar sin validación utilizando:
my_model.save validate: false
Casi no hay casos de uso válidos para esto, y debe considerarse un procedimiento de emergencia. Su caso de uso no califica.
Problemas con registros inválidos
Tener registros no válidos en la base de datos conduce a todo tipo de problemas en el futuro. Por ejemplo, envía un correo electrónico a todos los usuarios y actualiza un campo ''last_contacted_at'' en su modelo de usuario. Tus usuarios inválidos no serán actualizados y descenderán a una espiral de correo electrónico de la muerte.
Validación condicional
Como han señalado otros carteles, la validación condicional solucionará la mayoría de los problemas para los cuales podría haber utilizado validar: falso.
Estoy trabajando en un proyecto en Rails 3 donde necesito crear un registro vacío, guardarlo en la base de datos sin validación (porque está vacío) y luego permitir a los usuarios editar este registro para completarlo y validarlo desde entonces hacia fuera
Ahora me he encontrado con un problema bastante básico: parece que no puedo guardar un modelo sin validarlo bajo ninguna circunstancia.
He intentado lo siguiente en la consola:
model = Model.new
model.save(false) # Returns RuntimeError: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
model.save( :validate => false ) # Returns same error as above
model = Model.create
model.save(false) # Same runtime error
model.save( :validate => false ) # Same runtime error
Luego intenté cambiar todas las validaciones en el modelo a :on => :update
. Los mismos mensajes de error en cualquier intento de guardar.
Entonces, ¿qué me estoy perdiendo aquí? ¿Cómo puedo crear un registro vacío y luego permitir que se produzca la validación a medida que el usuario la edita?
¡Gracias!
*suspiro...*
Encontré el problema ... una de mis llamadas al método after_validate fue agregar información y volver a guardar el modelo, por lo tanto, los errores que recibía no provenían de la entrada de la consola, sino del método after_validate que se estaba guardando nuevamente.
Gracias a todos.
En lugar de colocar un modelo no válido en la base de datos, almacene el modelo parcialmente completado (creado con Model.new
) en una sesión . Solo guárdelo en la base de datos cuando sea completamente válido.
Es una mala práctica tener modelos inválidos guardados en casos de uso normales. Utilice validaciones condicionales en su lugar:
validates_presence_of :title, :unless => :in_first_stage?
o si tienes muchos:
with_options :unless => :in_first_stage? do
validates_presence_of :title
validates_presence_of :author
end
De esta manera, nada se interpone para realizar pruebas de integridad nocturnas, lo que comprueba la validez de todos los registros.
Un caso de uso válido para guardar sin validaciones sería para probar casos perimetrales, por ejemplo, para probar que se aplica una restricción de base de datos.