Rails:如何验证某些东西是否为布尔值?

aar*_*ona 111 validation ruby-on-rails

rails是否有像validates_numericality_ofboolean 那样的验证器,还是需要自己滚动?

Dre*_*ams 237

从Rails 3开始,您可以:

validates :field, inclusion: { in: [ true, false ] }
Run Code Online (Sandbox Code Playgroud)

  • 缩写形式`validates:field,inclusion:[true,false]` (51认同)
  • 请注意,对于布尔字段,您不能对presence的存在(`validates:field,presence:true`)进行常规验证(该字段对于`false`值无效).但是在Rails 3和4中,使用`validates:field,includes:[true,false]`将测试是否包含在值列表中,并使用副作用来测试字段的存在(除非其中一个值是当然是"nil". (7认同)
  • 因此,这会使验证正确,但错误消息对最终用户没有帮助:"myfield未包含在列表中" (2认同)
  • 好点子.您可以自定义错误消息:http://guides.rubyonrails.org/active_record_validations_callbacks.html#message (2认同)
  • 对于那些需要它并带有错误消息的人: `validates :field,clusion: { in: [ true, false ], message: "Please, select one!" }` (2认同)

Bud*_*gie 38

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

validates_inclusion_of :field_name, :in => [true, false]
Run Code Online (Sandbox Code Playgroud)

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

我不确定这对Rails 3是否仍然没问题,希望有所帮助!


小智 10

当我申请时,我得到:

来自shoulda-matcher的警告:

您正在使用validate_inclusion_of断言布尔列允许布尔值而不允许非布尔值.请注意,无法对此进行全面测试,因为布尔列会自动将非布尔值转换为布尔值.因此,您应该考虑删除此测试.


Fla*_*che 6

您可以使用较短的版本:

validates :field, inclusion: [true, false]
Run Code Online (Sandbox Code Playgroud)

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

KINDS = %w(opening appointment).freeze

enum kind: KINDS

validates :kind, inclusion: KINDS
Run Code Online (Sandbox Code Playgroud)