1

私は次のことをしようとしています:

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

したがって、ブール値の:availableがtrueの場合、:priceが存在する必要があり、falseの場合、:priceはnilである必要があります。

しかし、これをコンソールでテストすると、機能しません。私が間違っているかもしれないことについて何か考えはありますか?

4

2 に答える 2

2

あなたのコメントに基づいて、そして私が理解できることから、あなたは製品モデルを持っていて、製品利用可能フラグが真である場合にのみ価格を設定したいと思います。

他のコメントによると、検証を積み重ねることはできないと思います...そして、何らかの方法で可能であっても、「製品が利用できません」。

私の提案は、最初の検証のみを行い、フラグがfalseに設定されている場合は価格を黙って拒否することです。最初にjavascriptを使用してUXを改善し(ブール値がチェックされているときに入力を無効にします)、次にコールバック内で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
于 2012-05-07T12:26:20.267 に答える
2

ええ、今すぐ検証を積み重ねることができるかどうかわかりません。ただし、before_validation から必要なことを実行できる場合があります。

class Foo
  before_validation :price_matches_available

  def price_matches_available
    available ? price.present? : price.nil?
  end
end
于 2012-04-30T19:32:06.650 に答える