it-swarm-pt.tech

Valida com: se

Estou tentando criar uma condição na qual o atributo 'one' é zero e o atributo 'two' é um, então um modelo não é válido. Mas quando eu faço:

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

O teste de unidade retorna true! Por quê?

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

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

Eu acho que você tem um erro na sua sintaxe:

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

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

Havia um: se houver muitos lá ... E se eu entendi corretamente, você deseja validá-lo apenas no caso de one == 0 && two == 1? Então você condiciona_teste? está invertido (deixe de fora o! ())

Se não tiver certeza, tente usar alavanca e insira um ponto de interrupção no seu condition_testing? método para ver o que está acontecendo.

(Observe que foi adicionado ":" antes do teste de condição)

18
Tigraine

Você pode validá-lo em uma linha:

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

É melhor usar numericalidade e igual a.

validates :one, :numericality => { :equal_to => 0 }

validates :two, :numericality => { :equal_to => 1 }

http://guides.rubyonrails.org/active_record_validations_callbacks.html#numericality

4
psulightning

O problema é que você está usando um validador de presença com uma condição que verifica os valores dos atributos. Isto está incorreto. Um validador de presença verifica se esses atributos estão definidos. O pior é que você está passando a opção if (@Tigraine estava correto sobre sua sintaxe estar errada, a propósito), o que significa que sempre que esse método retorna verdadeiro, a presença não será verificada. Da maneira que você configurou, o validador será executado apenas quando one for igual a 1 e two for igual a 0. Caso contrário, nenhuma validação será executada! Eu acho que a melhor opção aqui é escrever uma validação 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

Isso adicionará um erro ao modelo com a mensagem especificada se a condição retornar verdadeira. (Observação: ainda não estou claro sobre qual condição é válida e qual é inválida, portanto, fique à vontade para alterar a última parte para atender às suas necessidades.)

3
Logan Leger