2012-05-30 13 views
20

Si necesita codificar una validación considerablemente compleja, el error a veces no se encuentra en un atributo particular, sino en una combinación de varios de ellos.¿Es posible agregar errores a un objeto ActiveRecord sin asociarlos con un atributo en particular?

Por ejemplo, si quiero validar que el período de tiempo entre: start_date y: end_date no contiene ningún domingo, el error no pertenece específicamente a ninguno de esos campos, pero el método de agregar errores requiere que se especifique.

Respuesta

29

trate de hacer algo como esto:

# Your Model.rb 
validate :my_own_validation_method 

... 

private 

def my_own_validation_method 
    if there_is_no_sunday_in_the_range 
     self.errors[:base] << "You must have a Sunday in the time range!" 
    end 
end 

Básicamente, usted puede añadir sus propias validaciones complejas a un modelo, y cuando ves que algo errónea ha sucedido, se puede añadir una cadena de error en la matriz de errores

+1

Perfecto, esto es justo lo que necesitaba. No se pudo encontrar en los documentos –

+2

¿Qué es: base en el hash de errores? – holaSenor

+4

Bueno, normalmente puede agregar un error a un atributo específico. Por ejemplo, si tiene un modelo 'User' que tiene un atributo' age', puede agregar un error para ese atributo, por lo que debe escribir 'self.errors [: age] <<" no puede ser menor que 0 "' que generará un error como "La edad no puede ser menor a 0". Pero si el error no se trata de ningún atributo específico, puede agregarlo a la base, es decir, al modelo en sí. Entonces 'self.errors [: base] <<" ¡Todo está mal! "' Hace que el mensaje de error "¡Todo esté mal!"; no está conectado a ningún atributo específico. – MrDanA

5

Puede usar errors[:base] para agregar errores generales que no están específicamente vinculados a un atributo - rails guide link.

7
model_instance.errors[:base] << "msg" 
1

En realidad se puede nombrar la clave hash lo desea:

instance.errors[:case_of_the_sundays] << "Error, son." 

Sólo un poco más descriptivo.

0

Las respuestas anteriores están desactualizadas. Para Rails 5 y superior, debe llamar al método ActiveModel::Errors add con :base como primer parámetro. Vea el ejemplo a continuación.

model_instance.errors.add(
    :base, 
    :name_or_email_blank, 
    message: "either name or email must be present" 
) 
Cuestiones relacionadas