2012-01-10 57 views
0

在應用程序中有rfq模型。有兩個領域。一個是need_report,它是一個布爾值。另一個是report_language,它是一個字符串。邏輯是,如果need_report爲真,那麼report_language中應該有一個條目。否則,如果need_report爲false,則report_language可能爲空。這裏是rfq.rb代碼:通過以下驗證:條件是否在rspec中失敗

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 

的錯誤是,詢價無效:

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)>' 

這種情況可能如果「驗證:need_report,:presence => true」,則從模型中刪除。看起來如果need_report是真的,那麼report_language不能爲空。

有關這個問題的任何想法?謝謝。

回答

1

您不能使用validates_presence_ofvalidates :column, :presence => true檢查布爾列是否爲空。

http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html#method-i-validates_presence_of

答:相反,你需要使用validates_inclusion_of和指定接受輸入,你已經有一個數組。這應該足以驗證你想要做什麼。

說明:您的第一個驗證是在列中看到false(在Ruby中相當於nil)。然後它在nil上運行.blank?並返回truefalse == nil & nil.blank? == true),這意味着它認爲列是空白的並且會引發錯誤。

+0

使用validates_presence_of後的錯誤是一樣的... – user938363 2012-01-10 20:52:54

+0

問題是由於false實際上是零。所以它將失敗驗證:need_report,:presence => true並使記錄無效。準確地說是 – user938363 2012-01-11 04:51:37

+0

。所以你可以擺脫第一次驗證,第二次驗證會達到你需要的目的。 – jstim 2012-01-11 05:27:30