Rails:如何验证某物是布尔值?


Answers:


244

从Rails 3开始,您可以执行以下操作:

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

2
因此,这样可以正确进行验证,但是错误消息对最终用户没有帮助:“ myfield未包含在列表中”
Peter Sankauskas

2
好点子。您可以自定义错误消息:guides.rubyonrails.org/…–
Drew Dara-Abrams

55
简短的形式validates :field, inclusion: [true, false]
鲜为人知的2013年

8
请注意,您不能validates :field, presence: true对布尔字段的状态()进行常规验证(该字段对于false值无效)。但是在Rails 3和Rails 4中,它们validates :field, inclusion: [true, false]都会测试是否包含在值列表中,并且具有副作用来测试字段的存在(nil当然,除非这些值之一是)。
马丁·卡雷尔

1
对于需要使用错误消息的用户:validates :field, inclusion: { in: [ true, false ], message: "Please, select one!" }
塔加斯主义

38

我相信对于布尔字段,您将需要执行以下操作:

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

从较旧版本的API中:“这是由于Object#blank?处理布尔值的方式。false.blank?#=> true”

我不确定这对Rails 3是否仍然适用,希望对您有所帮助!


大声笑@ Rails 3.我敢打赌,这将是未来几个月的警告。好的,我以为这很困难,您同意。谢谢!
aarona

对于Rails 4来说确实如此!哇,假的空白?#=> true似乎是错误的答案,这是Rails所不希望的。
丹·巴伦

1
这不起作用,因为任何字符串,例如“ foo”都将转换为true
Ka Mok

10

当我应用它时,我得到:

比赛应该警告:

您经常validate_inclusion_of断言布尔列允许布尔值,而不允许非布尔值。请注意,这不可能完全测试,因为布尔列会自动将非布尔值转换为布尔值。因此,您应该考虑删除此测试。


对于允许使用null的字段,是否仍将nil转换为布尔值?
mwfearnley

只需删除该测试,除非列可以为空,则应执行以下操作:它{应该allow_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回答

此帮助程序(存在)验证指定的属性不为空。它使用空白吗?检查值是nil还是空白字符串的方法,即,该字符串为空或包含空格。

既然是false.blank?是正确的,如果要验证布尔字段的存在,则应使用以下验证之一:

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

除更新的文档外,此答案与上一个答案相同,反映出不再需要哈希火箭这一事实。+1。
阿罗纳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.