Ваша проблема не имеет ничего общего с Ruby (или Rails) per se . Это связано с неправильным пониманием задействованных логических операторов, что, конечно, будет проблемой на любом языке.
Учтите это:
def test(x, y)
return true unless x || y
false unless x && y
end
p test(true, false) # => false
p test(true, true) # => nil
p test(false, false) # => true
В первом тесте (x = true, y = false
) первое условие не выполняется, потому что x || y
имеет значение true (оно будет успешным, только если x || y
оценено как false
, поскольку вы используете unless
вместо if
). Второе условие успешно, потому что x && y
не верно. Таким образом, метод возвращает false
.
Во втором тесте ни одно из условий не выполняется, поскольку оба значения x || y
и x && y
оцениваются как true
. (Опять же, поскольку вы используете unless
вместо if
, условие может быть успешно выполнено, только если оно оценивается как false
.) Итак, метод возвращает nil
.
В третьем тесте первое условие успешно, потому что x || y
оценивается как false
. Итак, метод возвращает false
.
Маловероятно, что вам нужны эти логические условия. Во-первых, вы, вероятно, не хотите набор логических условий, которые не охватывают все возможности. Также я не вижу причин для использования unless
вместо if
; кажется, что вы без необходимости усложняете свою логику c.
Конечно, вы точно не объяснили, какие логические условия вы ищете, поэтому мы все играем здесь в «слепую механику» c »в некоторой степени. Но я чувствую, что вы пытаетесь проверить, присутствует ли ваш crit_val1
или crit_val2
, и вернуть false
, если какой-либо из них присутствует. Если это так, все, что вам нужно сделать, это:
def match_criteria(crit_val1, crit_val2)
# other stuff
return false if crit_val1.present? || crit_val2.present?
true
end