2012-07-30 14 views
5

Resumen: Estoy tratando de alterar el valor de un atributo dentro de una costumbre ActiveModel::EachValidator validador. Dado el siguiente prototipo:cambiar o actualizar un valor de atributo durante la validación rieles ActiveRecord

def validate_each(record, attribute, value)

tratando de establecer value = thing no parece hacer nada - me estoy perdiendo algo? Debería haber una forma inteligente de hacerlo ...

Detalle: Acepto una entrada de URL como parte de un sitio. No quiero simplemente tomar la URL y validar directamente que devuelve un mensaje 200 OK, porque eso ignoraría las entradas que no comenzaron con http, o dejó fuera el www líder, etc. Tengo un poco de lógica personalizada para tratar con esos errores y seguir redireccionamientos. Por lo tanto, me gustaría que la validación a tenga éxito si un usuario escribe en example.org/article en lugar de http://www.example.org/article. La lógica funciona correctamente dentro de la validación, pero el problema es que si alguien escribe en el primero, el valor almacenado en la base de datos está en el formato "incorrecto" en lugar de en el bien actualizado. ¿Puedo cambiar la entrada durante la validación a una forma más canónica?

+0

+1 por preguntar buena pregunta – neeraj

Respuesta

11

Debe dejar la validación de hacer precisamente eso: validar; no es el lugar correcto para manipular los atributos de su modelo.

Ver ActiveModel's before_validation devolución de llamada. Este es un lugar más apropiado para manipular los atributos del modelo en preparación para la validación.

Parece que tiene que indicarle a su implementación de ActiveModel las devoluciones de llamada, al menos según this SO question.

class YourModel 
    extend ActiveModel::Callbacks 
    include ActiveModel::Validations 
    include ActiveModel::Validations::Callbacks 

    before_validation :manipulate_attributes 

    def manipulate_attributes 
    # Your manipulation here. 
    end 
end 
+0

Buena decisión - no tratan de cambiar las cosas durante la validación. Agregar un código en before_validation ayuda, ¡gracias! – aardvarkk

+0

+1 por dar una buena solución ya que estaba buscando lo mismo. – neeraj

Cuestiones relacionadas