在应用中拥有rfq模型。有两个领域。一个是need_report,它是一个布尔值。另一个是report_language,它是一个字符串。逻辑是如果need_report为true,那么report_language中应该有一个条目。否则,如果need_report为false,则report_language可能为空。这是rfq.rb中的代码:
validates :need_report, :presence => true
validates_inclusion_of :need_report, :in => [true, false]
validates :report_language, :presence => {:if => :need_report?}
def need_report?
need_report
end
但是以下rspec案例失败了:
it "should be OK for nil report_language if need_report is false" do
rfq = Factory.build(:rfq, :need_report => false, :report_language => nil)
rfq.should be_valid
end
错误是rfq无效:
1) Rfq should be OK for nil report_language if need_report is false
Failure/Error: rfq.should be_valid
expected valid? to return true, got false
# ./spec/models/rfq_spec.rb:57:in `block (2 levels) in <top (required)>'
如果从模型中删除“validates:need_report,:presence =&gt; true”,则可以通过此案例。似乎如果need_report为true,则report_language不能为空。
有关这个问题的任何想法?感谢。
答案 0 :(得分:1)
您无法使用validates_presence_of
或validates :column, :presence => true
来检查布尔列是否为空。
答案:您需要使用validates_inclusion_of
并指定已有的已接受输入数组。这应该足以验证您想要做什么。
说明:您的第一个验证是在列中看到false
(在Ruby中等同于nil
)。然后它会在.blank?
上运行nil
并返回true
(false == nil
&amp; nil.blank? == true
),这意味着它认为该列为空并且会引发错误。