2012-01-10 7 views
0

アプリでrfqモデルを使用しています。 2つのフィールドがあります。一つはneed_reportでブール値です。もう1つはreport_languageで、これは文字列です。ロジックは、need_reportがtrueの場合、report_languageに項目が存在する必要があります。それ以外の場合は、need_reportがfalseの場合、report_languageは空になります。ここでは、コードrfq.rbである:は以下の条件で検証します:if条件が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 

エラーが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 => true"がモデルから削除された場合に合格します。 need_reportがtrueの場合、report_languageを空にすることはできないようです。

問題についてのご意見はありますか?ありがとう。

答えて

1

ブール型列が空であるかどうかをチェックするのに、validates_presence_ofまたはvalidates :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

+0

この問題は、falseが実際にはゼロであることによって発生します。したがって、検証に失敗します:need_report、:presence => trueおよびレコードを無効にします。 – user938363

+0

。あなたは最初の検証を取り除くことができ、2番目の検証は必要な目的に役立ちます。 – jstim

関連する問題