8

Estoy tratando de crear una condición en la cual el atributo 'uno' es cero y el atributo 'dos' es uno, entonces un modelo no es válido. Pero cuando hago: PruebaValida con: si

Model.create(:one => 1, :two => 0).valid? 

La unidad vuelve true! ¿Por qué?

validates :one, :two, :presence => true, :if => :if condition_testing? 

def condition_testing? 
    !(one == 0 && two == 1) 
end 

Respuesta

12

yo creo que hay un error en su sintaxis:

validates :one, :two, :presence => true, :if => :condition_testing? 

def condition_testing? 
    !(one == 0 && two == 1) 
end 

Había uno: si hay demasiados en ... Y si he entendido bien que desea tener sólo valida en estuche one == 0 && two == 1? ¿Entonces usted condition_testing? está invertido (¡omita!)

Si no está seguro, intente utilizar pry e inserte un punto de interrupción en su método condition_testing? para ver qué está pasando.

(Tenga en cuenta añadido ":" antes de la prueba condición)

+0

No, eso es correcto. Lo que ocurre es que, independientemente de los valores de los atributos, siempre dice que el modelo es válido, y quiero que cuando 'uno' y 'dos' sean 0 y 1 que indiquen que el modelo no es válido. – James

3

El problema es que usted está usando un validador de presencia con una condición que comprueba los valores de los atributos. Esto es incorrecto. Un validador de presencia comprueba para asegurarse de que esos atributos estén establecidos. Lo que es peor, está pasando la opción if (@Tigraine tenía razón acerca de que su sintaxis es incorrecta, por cierto), lo que significa que siempre que ese método devuelva verdadero, la presencia no se comprobará en absoluto. La forma en que tiene esta configuración, el validador se ejecutará solo cuando one es igual a 1 y two es igual a 0. De lo contrario, no se ejecutan las validaciones en absoluto! Creo que la mejor opción aquí es escribir una validación personalizada:

validates :one_and_two 

def one_and_two 
    errors.add(:base, "one must be 1 and two must be 0") if !(one == 0 && two == 1) 
end 

Esto añadirá un error al modelo con el mensaje especificado si la condición devuelve true. (Nota: todavía no estoy seguro de qué condición es válida y cuál no es válida, así que siéntete libre de cambiar esa última parte para adaptarla a tus necesidades.)

+0

"lo que significa que siempre que el método devuelva verdadero, la presencia no se comprobará en absoluto": esto es completamente incorrecto. http://guides.rubyonrails.org/active_record_validations.html#conditional-validation - la validación se ejecuta solo si: si el método devuelve verdadero. – Aldekein

8

puede validar en una línea:

validates :one, :two, :presence => true, :if => Proc.new { |a| !(a.one == 0 && a.two == 1) } 
Cuestiones relacionadas