Рейки: як я підтверджую, що щось булеве?


115

Чи є в рейках валідатор, як validates_numericality_ofу булевих, чи мені потрібно катати свою?

Відповіді:


244

З Rails 3 ви можете:

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

2
Таким чином, це отримує право на перевірку, але повідомлення про помилку не є корисним для кінцевого користувача: "myfield не включено до списку"
Peter Sankauskas

2
Гарна думка. Ви можете налаштувати повідомлення про помилку: guides.rubyonrails.org/…
Дрю Дара-Абрамс

55
Коротша формаvalidates :field, inclusion: [true, false]
ледь невідомий

8
Зауважте, що ви не можете мати звичайну перевірку присутності ( validates :field, presence: true) для булевого поля (поле не буде дійсним для falseзначення). Але в обох рейках 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. Я можу обміняти, що це буде застереженням на наступні місяці. Гаразд, я думав, що цей міг був, і ви згодні. Дякую!
aarona

Це правда для Rails 4! Нічого, помилково. # => правда просто здається невірною відповіддю, чого б я не очікував від Rails.
Ден Баррон

1
Це не працює, оскільки будь-який рядок, наприклад, "foo" буде перетворений в true.
Ka Mok

10

Коли я застосовую це, я отримую:

Попередження від слідків:

Ви використовуєте validate_inclusion_ofдля того, щоб стверджувати, що булева графа дозволяє булеві значення та забороняє не булеві. Пам’ятайте, що повністю перевірити це неможливо, оскільки булеві стовпці автоматично перетворять не булеві значення в булі. Отже, вам слід розглянути можливість видалення цього тесту.


Для полів, де дозволено null, він все ще перетворює нуль у логічний?
mwfearnley

Просто видаліть цей тест, за винятком випадків, коли стовпчик є нульовим, ви повинні зробити це: it {should enable_value (nil) .for (: field)} Довідка
Ardi Nusawan

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.