2009-10-23 11 views
55

Acabo de actualizar mis rails a 2.3.4 y me di cuenta de esto con las validaciones: Digamos que tengo un modelo simple de la empresa que tiene un nombre. nada a eso. Quiero correr mi propia validación:llamando a métodos de validación personalizados en Rails

class Company < ActiveRecord::Base 

    validate :something 


    def something 
    false 
    end 

end 

guardar el modelo en realidad funciona en este caso. Lo mismo sucede si anulo validate() y devuelvo falso. Noté esto en un modelo más complejo en el que mi validación devolvía falsa, pero el objeto aún se guardaba ... Lo probé en un modelo esencialmente vacío y se aplicó lo mismo. ¿Existe una nueva práctica que me falta? Esto no parece ser el caso en algunos de mis códigos de rieles más antiguos.

+0

Gracias. Ese es casi definitivamente el caso. Supongo que con el nuevo proyecto olvidé agregar errores, y con los más antiguos definitivamente los tenía allí. Duh. gracias a todos. – cgr

Respuesta

107

Sus validaciones se ejecutan cuando utiliza el método validate. Sin embargo, los rieles no dependen del valor devuelto.

Se basa en si hay errores de validación o no. Por lo tanto, debe agregar errores cuando su modelo no se valida.

def something 
    errors.add(:field, 'error message') 
end 

O bien, si el error no está relacionado con un campo:

def something 
    errors.add(:base, 'error message') 
end 

Entonces no se guardará su modelo porque hay errores.

+0

ordenada, gracias! esto es útil – marcgg

+0

add_to_base ya no es correcto a partir de Rails 3. Consulte la respuesta de @MagedMakled. – Undistraction

+0

Acabo de actualizar la respuesta. Gracias. –

14

Te confunden las validaciones y las devoluciones de llamada.

Se supone que las validaciones fallan si hay errores en el objeto, no importa de qué devuelve la validación. Las devoluciones de llamada fallan si devuelven falso, independientemente de si agregan algún error al objeto.

¿Rails utiliza llamadas válidas? de guardar llamadas que no verifica el resultado de ninguna validación.

Editar: Rails trata validate :method como una devolución de llamada, pero válido? aún no verifica sus resultados, solo por los errores que agregaron al objeto.

No creo que este comportamiento haya cambiado en absoluto, pero podría estar equivocado. No creo que alguna vez haya escrito una validación para devolver falso antes.

+1

Estaba intentando crear una validación para new_records, así que creé un método para usar con la devolución de llamada Obj.before_validation_on_create y agregué algunos errores base. Sin embargo, el objeto se creará incluso cuando mi devolución de llamada haya agregado un error base. ¡Funcionó solo cuando hice que mi devolución de llamada fuera "falsa" como sugeriste! Gracias por señalar cómo hacer que la devolución de llamada falle – Coderama

8

Para su información errors.add_to_base('error message') ya no se utiliza en los carriles 3 y obtuve reemplazado por

errors[:base] << "Error message" 

O

errors.add(:base, "Error message") 
Cuestiones relacionadas