Rails:我如何验证某个东西是布尔值?

Posted

技术标签:

【中文标题】Rails:我如何验证某个东西是布尔值?【英文标题】:Rails: how do I validate that something is a boolean? 【发布时间】:2011-04-06 04:53:15 【问题描述】:

rails 是否有类似 validates_numericality_of 的布尔值验证器,还是我需要自己滚动?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

lol @ Rails 3。我敢打赌这将是未来几个月的警告。好的,我认为这就是它,你同意。谢谢! Rails 4 确实如此!哇,假的。空白? # => true 似乎是 错误 的答案,这是我对 Rails 的不期望。 这不起作用,因为任何字符串例如“foo”都会被转换成true【参考方案2】:

从 Rails 3 开始,您可以:

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

【讨论】:

因此,这获得了正确的验证,但错误消息对最终用户没有帮助:“myfield is not included in the list” 好点。可以自定义报错信息:guides.rubyonrails.org/… 短格式validates :field, inclusion: [true, false] 请注意,您不能对布尔字段的存在性 (validates :field, presence: true) 进行常规验证(该字段对于 false 值无效)。但是在 Rails 3 和 4 中,validates :field, inclusion: [true, false] 将测试是否包含在值列表中,并具有测试字段是否存在的副作用(当然,除非其中一个值是 nil)。 对于那些需要它并带有错误消息的人:validates :field, inclusion: in: [ true, false ], message: "Please, select one!" 【参考方案3】:

当我应用这个时,我得到:

来自 shoulda-matchers 的警告:

您正在使用 validate_inclusion_of 断言布尔列 允许布尔值并禁止非布尔值。请注意,它 无法完全测试这一点,因为布尔列将 自动将非布尔值转换为布尔值。因此,你 应该考虑删除这个测试。

【讨论】:

对于允许 null 的字段,是否仍将 nil 转换为布尔值? 只需删除该测试,除非列可以为空,否则您应该这样做:it should allow_value(nil).for(:field) Reference 上述评论中的链接已损坏,但这是一个有效的链接:matchers.shoulda.io/docs/v4.4.1/Shoulda/Matchers/…【参考方案4】:

您可以使用较短的版本:

validates :field, inclusion: [true, false]

额外的想法。在处理枚举时,我也喜欢使用常量:

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS

【讨论】:

【参考方案5】:

根据Rails Docs 5.2.3回答

这个助手(存在)验证指定的属性不为空。它使用空白?方法来检查值是 nil 还是空字符串,即一个空字符串或由空格组成的字符串。

因为 false.blank?是的,如果你想验证布尔字段的存在,你应该使用以下验证之一:

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

【讨论】:

这与之前的答案相同,除了更新的文档反映了不再需要哈希火箭的事实。 +1。

以上是关于Rails:我如何验证某个东西是布尔值?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 数据库布尔值

Rails 4:使用 link_to 切换布尔值

Rails 3 SQLite3 布尔值 false

使用 ruby​​ on rails 将布尔值保存到 postgres 数据库

使用枚举与布尔值?

将 :default => true 添加到现有 Rails 列中的布尔值