現在、などvalidates
よりも優先validates_presences_of
されています。hyperjasが述べたように、これを行うことができます。
validates :shipping_cost,
:shipping_cost_anywhere,
:presence => true, :if => :shipping?
:shipping_cost
ただし、これにより、との両方の検証全体が条件付けられ:shipping_cost_anywhere
ます。保守性を高めるために、validate
属性ごとに個別の宣言を使用することをお勧めします。
さらに重要なことに、条件が異なる複数の検証がある状況に遭遇する可能性があります(1つはプレゼンス、もう1つは長さ、形式、値など)。あなたはこのようにそれを行うことができます:
validates :shipping_cost,
presence: { if: :shipping? },
numericality: { greater_than: 100, if: :heavy? }
レールにルビー文字列を評価させることもできます。
validates :shipping_cost,
presence: { if: "shipping?" },
numericality: { greater_than: 100, if: "shipping? and heavy?" }
そして最後に、オプションで個別のカスタムメッセージを追加します。
validates :shipping_cost,
presence: { if: "shipping?", message: 'You forgot the shipping cost.' },
numericality: { greater_than: 100, if: "shipping? and heavy?", message: 'Shipping heavy items is $100 minimum.' }
等々。お役に立てば幸いです。