【问题标题】:Validation inclusions_of accept strings as false values验证包含_of 接受字符串作为假值
【发布时间】:2012-07-17 10:08:27
【问题描述】:

我正在使用 MonogID 创建一些模型,其中一个是可以接受 nil 值的布尔值。这是我定义模型的方式。

class Status
  include Mongoid::Document
  field :pending, type: Boolean
  validates :pending, inclusion: { in: [true, false], allow_nil: true }
  #...
end

如您所见,我将接受的值设置为布尔值和零。问题是当我分配一个字符串时,它被转换为 false 并被接受。这样,验证不起作用。在这种情况下,第二个测试失败了。

it { [true, false, nil].each { |value| should allow_value(value).for(:pending) } }
it { ['not_valid', ''].each { |value| should_not allow_value(value).for(:pending) } }

现在,我提出的唯一解决方案是制作一个自定义验证器,以检查 TrueClass、FalseClass 或 NilClass 的值,但似乎我失去了一个更简单的解决方案。我在网上查了一下,但没有找到解决办法。

谢谢。

【问题讨论】:

    标签: ruby-on-rails-3 mongoid


    【解决方案1】:

    您无法找到解决方案,因为当您将值分配给布尔字段时,它会将该值解释为 true、false 或 nil,而当您尝试保存时,它将具有其中一个值(true、false、 nil) 将通过验证。

    【讨论】:

    • 我终于明白了。我仍然很想知道可能的解决方案。
    • 现在我接受这样一个事实,即任何不同于“true”的字符串都被视为错误值。但我想,就目前而言,真正的解决方案是制作一个验证器来检查你得到的类。
    • 但是你总是会在这个字段中得到这三个类 TrueClass、FalseClass 和 NilClass 如果你没有从中得到任何其他值,那么需要验证是否包含。我只是想明白。
    • 我希望人们会犯错误。实际上他们可以发送一个字符串,而不是默默地将'false'设置为值,我想给他们一个错误消息。我认为无声错误很糟糕。
    • 但是通过验证我们无法做出这样的判断。因为当一个字符串将被分配给布尔字段时,它将用这三个真、假和零中的任何一个来解释它。并且在检查验证时无法检查。如果您有其他解决方案,请与我分享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多