Rails: como faço para validar se algo é booleano?

115

O rails tem um validador como o validates_numericality_ofbooleano ou preciso fazer o meu próprio?

Aarona
fonte

Respostas:

244

Desde Rails 3, você pode fazer:

validates :field, inclusion: { in: [ true, false ] }
Drew Dara-Abrams
fonte
2
Então, isso acerta a validação, mas a mensagem de erro não é útil para o usuário final: "meu campo não está incluído na lista"
Peter Sankauskas
2
Bom ponto. Você pode personalizar a mensagem de erro: guias.rubyonrails.org/…
Drew Dara-Abrams
55
Forma mais curtavalidates :field, inclusion: [true, false]
conhecida em
8
Observe que você não pode ter a validação usual para a presença ( validates :field, presence: true) para um campo booleano (o campo não seria válido para um falsevalor). Mas em ambos os Rails 3 e 4, tendo validates :field, inclusion: [true, false]testaria para inclusão em uma lista de valores, com o efeito colateral de testar a presença do campo (a menos que um desses valores seja, é nilclaro).
Martin Carel
1
E para aqueles que precisam com uma mensagem de erro:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
tagaism
38

Eu acredito que para um campo booleano você precisará fazer algo como:

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

De uma versão mais antiga da API : "Isso se deve à maneira como Object # blank? Lida com valores booleanos. False.blank? # => True"

Não tenho certeza se isso ainda vai funcionar para Rails 3, espero que tenha ajudado!

Periquito
fonte
lol @ Rails 3. Posso apostar que essa será a advertência nos próximos meses. Ok, pensei que era isso e você concorda. Obrigado!
aarona
É verdade para o Rails 4! Uau, false.blank? # => verdadeiro parece ser a resposta errada , algo que eu não esperaria do Rails.
Dan Barron
1
Isso não funciona, pois qualquer string, por exemplo, "foo" será convertida em true.
Ka Mok
10

Quando aplico isso, recebo:

Aviso de igualadores de deveria:

Você está usando validate_inclusion_ofpara afirmar que uma coluna booleana permite valores booleanos e não permite valores não booleanos. Esteja ciente de que não é possível testar isso totalmente, pois as colunas booleanas converterão automaticamente valores não booleanos em booleanos. Portanto, você deve considerar a remoção deste teste.

user708617
fonte
Para campos onde nulo é permitido, ele ainda converte nil em booleano?
mwfearnley
Apenas remova esse teste, exceto se a coluna for anulável, você deve fazer o seguinte: it {should allow_value (nil) .for (: field)} Referência
Ardi Nusawan
4

Você pode usar a versão mais curta:

validates :field, inclusion: [true, false]

Pensamento extra. Ao lidar com enums, também gosto de usar uma constante:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS
Flavio Wuensche
fonte
2

Resposta de acordo com Rails Docs 5.2.3

Este auxiliar (presença) valida se os atributos especificados não estão vazios. Ele usa o branco? método para verificar se o valor é nulo ou uma string em branco, ou seja, uma string que está vazia ou consiste em um espaço em branco.

Desde false.blank? for true, se você deseja validar a presença de um campo booleano, você deve usar uma das seguintes validações:

validates :boolean_field_name, inclusion: { in: [true, false] }
Cody Elhard
fonte
Esta é a mesma resposta que a anterior, exceto que os documentos atualizados refletem o fato de que os foguetes hash não são mais necessários. +1.
aarona