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

115

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

aarona
источник

Ответы:

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чтобы утверждать, что логический столбец допускает логические значения и запрещает небулевские значения. Имейте в виду, что полностью протестировать это невозможно, так как логические столбцы автоматически преобразуют небулевы значения в логические. Следовательно, вам следует рассмотреть возможность удаления этого теста.

user708617
источник
Для полей, где разрешено значение 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.
Аарона