Подтверждает с помощью: если - PullRequest
11 голосов
/ 16 декабря 2011

Я пытаюсь создать условие, в котором атрибут 'one' равен нулю, а атрибут 'two' равен единице, тогда модель недопустима.Но когда я делаю:

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

Модульный тест возвращает true!Почему?

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

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

Ответы [ 4 ]

18 голосов
/ 16 декабря 2011

Я думаю, что у вас есть ошибка в вашем синтаксисе:

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

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

Был один: если их слишком много ... И если я правильно понимаю, вы хотите, чтобы это проверялось только в случае one == 0 && two == 1?Тогда вы проводите тестирование?инвертировано (пропустите! ())

Если вы не уверены, вы можете попытаться использовать pry и вставить точку останова в ваш метод condition_testing?, чтобы увидеть, что происходит.1011 * (обратите внимание, добавлено ":" перед проверкой состояния)

11 голосов
/ 01 мая 2015

Вы можете проверить его в одной строке:

validates :one, :two, :presence => true, :if => Proc.new { |a| !(a.one == 0 && a.two == 1) }
4 голосов
/ 29 августа 2012

Вам лучше использовать цифры и равны.

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

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

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

3 голосов
/ 16 декабря 2011

Проблема в том, что вы используете средство проверки присутствия с условием, которое проверяет значения атрибутов. Это неверно Валидатор присутствия проверяет, установлены ли эти атрибуты. Что еще хуже, вы передаете опцию if (кстати, @Tigraine правильно сказал, что ваш синтаксис неверен), что означает, что всякий раз, когда этот метод возвращает true, присутствие вообще не проверяется. Как вы настроили, валидатор будет работать только тогда, когда one равно 1, а two равно 0. В противном случае проверки вообще не выполняются! Я думаю, что лучший вариант здесь - написать пользовательскую проверку:

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

Это добавит ошибку в модель с указанным сообщением, если условие вернет true. (Примечание: мне все еще не ясно, какое условие является действительным, а какое недействительным, поэтому смело меняйте эту последнюю часть в соответствии с вашими потребностями.)

...