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:我如何验证某个东西是布尔值?的主要内容,如果未能解决你的问题,请参考以下文章