2012-04-30 12 views
0

を働いていない:Railsの条件の検証は、私は次の操作を実行しようとしています

validates :price, :presence => true, :if => Proc.new {|p| p.available == true} 
    validates :price, :presence => false, :if => Proc.new {|p| p.available == false} 

をブール場合ようにするため:利用できるが、真で価格がゼロでなければなりません。

しかし、ときに私はそれが仕事をdoesntのコンソールでこれをテストします。私は何が間違っているかもしれないかについてのあらゆる考え?

+0

参照[条件付き検証ドキュメント](http://guides.rubyonrails.org/active_record_validations_callbacks.html#using-a-proc-with-if-と - )。私はあなたが*可能であれば価格を持っていない*を執行しようとしていると仮定しています。 –

+0

それは正しいです。そして、私はちょうどそれらをチェックしましたが、何が間違っているかもしれないかについての手がかりは見えませんでした... –

+0

私は検証が積み重ねられるとは思いません - 私はあなたを "グループ化"部分に言及していました。 –

答えて

2

ええ、今、検証を積み重ねることができません。しかし、あなたはbefore_validationからあなたが望むことができるかもしれません。あなたのコメントに、私はあなたが製品のモデルを持っている、とあなたが製品利用可能フラグがtrueの場合にのみ、価格を設定したい理解することができたものから基づい

class Foo 
    before_validation :price_matches_available 

    def price_matches_available 
    available ? price.present? : price.nil? 
    end 
end 
+0

EDIT:そのメソッドは依然としてバリデーターとして機能しますか?(オブジェクトを有効または無効とマークしますか?ありがとう! –

+2

私ははいと言うだろうが、StackOverflowはコメントのために15文字を必要とするので、yeeeeeeeeeeeees。 –

+1

haha​​。私は "ハハハハハハ" –

2

他のコメントを1として、私は...あなたが検証を積み重ねることができるとは思わないそして、それはいくつかの方法で可能だとしても、私は価格」のような検証エラーがあってはならない持っている良いUXとは思いません製品が使用できない場合に設定します。

私の提案は最初の検証を持つことである、とフラグがfalseに設定されている場合は黙って価格を拒否します。最初に、良いUXのjavascript経由で(ブール値がチェックされているときは入力を無効にする)、そしてコールバックの中で誰もHTMLを改ざんしないようにする。

ルビー部分は次のように行くことができます:

class Product < ActiveRecord::Base 

    validates :price, presence: true, if: "available?" 

    before_save :reject_price, if: "available? == false" 

    private 

    def reject_price 
    self.price = nil 
    end 
end 
関連する問題