Rails: как проверить, является ли что-то логическим?


115

Есть ли у рельсов валидатор, например, validates_numericality_ofдля логического значения, или мне нужно катать собственный?

Ответы:


244

Начиная с Rails 3, вы можете:

validates :field, inclusion: { in: [ true, false ] }

2
Итак, это дает правильную проверку, но сообщение об ошибке бесполезно для конечного пользователя: «myfield не включено в список»
Питер Санкаускас

2
Хорошая точка зрения. Вы можете настроить сообщение об ошибке: guides.rubyonrails.org/…
Дрю Дара-Абрамс

55
Укороченная формаvalidates :field, inclusion: [true, false]
елеизвестный

8
Обратите внимание, что у вас не может быть обычной проверки присутствия ( validates :field, presence: true) для логического поля (поле не будет действительным для falseзначения). Но как в Rails 3, так и в 4, наличие validates :field, inclusion: [true, false]будет проверять на включение в список значений с побочным эффектом для проверки наличия поля (если, nilконечно, одно из этих значений не присутствует ).
Мартин Карел,

1
И для тех, кому это нужно, с сообщением об ошибке:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaism

38

Я считаю, что для логического поля вам нужно будет сделать что-то вроде:

validates_inclusion_of :field_name, :in => [true, false]

Из более старой версии API : «Это связано с тем, как Object # blank? Обрабатывает логические значения. False.blank? # => True»

Я не уверен, что это все еще подойдет для Rails 3, надеюсь, это помогло!


lol @ Rails 3. Могу поспорить, что это будет предостережением в ближайшие месяцы. Хорошо, я думал, что это был миг, и вы согласны. Спасибо!
Аарона

Это верно для Rails 4! Вау, ложь. Пустой? # => true кажется неправильным ответом, чего я не ожидал от Rails.
Дэн Бэррон,

1
Это не работает, так как любая строка, например "foo", будет преобразована в true.
Ka Mok

10

Когда я применяю это, я получаю:

Предупреждение от shoulda-matchers:

Вы используете, validate_inclusion_ofчтобы утверждать, что логический столбец допускает логические значения и запрещает небулевские значения. Имейте в виду, что полностью протестировать это невозможно, так как логические столбцы автоматически преобразуют небулевы значения в логические. Следовательно, вам следует рассмотреть возможность удаления этого теста.


Для полей, где разрешено значение null, по-прежнему ли он преобразует nil в логическое значение?
mwfearnley

Просто удалите этот тест, за исключением случаев, когда столбец допускает значение NULL, вы должны сделать это: он {should allow_value (nil) .for (: field)} Ссылка
Арди Нусаван

4

Вы можете использовать более короткую версию:

validates :field, inclusion: [true, false]

Дополнительная мысль. При работе с перечислениями я тоже люблю использовать константу:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS

2

Ответ согласно Rails Docs 5.2.3

Этот помощник (присутствие) проверяет, что указанные атрибуты не пусты. Использует заготовку? , чтобы проверить, является ли значение нулевым или пустой строкой, то есть строкой, которая либо пуста, либо состоит из пробелов.

Поскольку false.blank? верно, если вы хотите проверить наличие логического поля, вы должны использовать одну из следующих проверок:

validates :boolean_field_name, inclusion: { in: [true, false] }

Это тот же ответ, что и предыдущий, за исключением того, что обновленные документы отражают тот факт, что хэш-ракеты больше не нужны. +1.
Аарона
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.