2011-11-09 17 views
1

validates_numericality_of私は、モデル内のデータを検証して、RSpecのを使用してこのモデルをテストする必要があります。ここでは検証が失敗し、

は、モデルでの検証です:

validates_presence_of :sales_price 
validates_presence_of :retail_price 

validates_numericality_of :sales_price, :greater_than => 0 
validates_numericality_of :retail_price,:greater_than => 0 
validates_numericality_of :sales_price, :less_than => :retail_price, 
              :message => "must be less than retail price." 

私がしようとしているとき私はこのエラーを取得し、この

it { should validate_presence_of :sales_price } 
it { should validate_presence_of :retail_price } 
it { should validate_numericality_of :sales_price } 
it { should validate_numericality_of :retail_price } 

のようなテストカントーモデル

Failure/Error: it { should validate_presence_of :retail_price } 
ArgumentError: 
    comparison of Float with nil failed 
# ./spec/models/offer_option_spec.rb:19:in `block (2 levels) in <top (required)>' 

どうすればこの問題を解決できますか?

+0

おそらく、それを見る別の方法です: 'validates_presence_of'が必要ですか? validates_numericality_ofはすでに 'retail_price'がnilでないことを保証します。 'sales_price'ではうまく動作しますが、' retail_price'では動作しないのは奇妙なようです。 – sled

答えて

3

にお返事ありがとうございます。

私はついにこれを手に入れました。

validates_numericality_of :sales_price, :greater_than => 0, 
         :allow_blank => true 
validates_numericality_of :retail_price, :greater_than => 0, 
         :allow_blank => true 
validates_numericality_of :sales_price, :less_than => :retail_price, 
         :if => Proc.new { |o| !o.retail_price.nil? } , 
         :message => "can't be greater than retail price." 

もう1つ問題があります。私はrails.validation.jsを使用しています。これはクライアント側のバリデーションを実行するのに役立ちます。すべてはあなたの数値バリでこのようなものを使用する場合はokです:

:greater_than => 0 

validation.jsフィールドの値が0より大きければ関数がそのように作成されたチェック機能を作成します

new Function("return " + element.val() + CHECKS[check] + options[check])())) 

要素が私の入力フィールドであり、 点検異なるハッシュが含ま:LESS_THAN:<、GREATER_THAN:>など オプション[確認]を(バリデータに渡されるいくつかの値を含む:GREATER_THAN => 0、この場合はゼロ、 options [check]はless_than: '0')です。ただ

Uncaught ReferenceError: retail_price is not defined 

が、私はこの

validates_numericality_of :sales_price, :less_than => Proc.new{ self.retail_price }, 
         :if => Proc.new { |o| !o.retail_price.nil? } , 
         :message => "can't be greater than retail price." 

のようなものを試してみましたが、検証が行われたときにオブジェクトが存在しないので、自己:私は価値の別のものを使用した場合しかし、私はエラーを取得しますクラスを指し、retail_priceは存在しません。

問題を解決するにはどうすればよいですか?

+0

'less_than' procを' Proc.new {| o | o.retail_price} ' - もし' procと同じアプローチです。 –

3

@sledは、nilチェックがvalidates_numericality_ofに組み込まれており、デフォルトで有効になっているので、両方の要件を満たす必要はありません。

もう1つ注目すべきことは、販売価格が実際に問題を引き起こしている可能性のある数値を2回検証していることです。代わりに代わりに

validates_numericality_of :sales_price, :greater_than => 0, :less_than => :retail_price, :message => "must be less than retail price." 
+0

ええ、私はあなたがそれのようなバリデータを積み重ねることができるかどうかは分かりません。 –

関連する問題