4

:shipping_costこれらの2つの属性の存在を検証し:shipping_cost_anywhere、属性:shippingがに等しいかどうかを検証したいと思いますtrue。で、もし

私のモデルにはこれがありますが、うまく機能していません:

validates_presence_of :shipping_cost, :shipping_cost_anywhere, :allow_blank => "true" if :shipping == "true"

これは私の:shipping属性です:

field :shipping, :type => Boolean, :default => "false"

どうすればいいですか?

ありがとうございました!

編集しました。

私はmongoidとsimple_formの宝石を使用しています

4

6 に答える 6

12
validates_presence_of :shipping_costs_anywhere, :if => :should_be_filled_in?

def should_be_filled_in?
  shipping_costs_anywhere == "value"
end

このメソッドは、ステートメントで呼び出されたときにtrueまたはfalseを返します。コロンをshipping_costs_anywhereの前に置く必要はありません。

于 2012-05-08T15:20:51.247 に答える
5

この質問に対する私のための修正は次のコードです:

validates :shipping_cost, :shipping_cost_anywhere, :presence => true, :if => :shipping?

皆さんの助けに感謝しますが、どんな答えも私のために働きました。ありがとう!

于 2012-05-08T16:29:04.090 に答える
4

今日これに出くわし、答えを一新したいと思いました。他の人が述べたように、ロジックを関数に入れることができます。ただし、procにスローすることもできます。

validates_presence_of :shipping_costs_anywhere, :if => Proc.new { |o|
  o.shipping_costs_anywhere == "value"}

http://guides.rubyonrails.org/active_record_validations.html#using-a-symbol-with-if-and-unless

于 2013-11-22T21:09:36.253 に答える
4

現在、など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.' }

等々。お役に立てば幸いです。

于 2016-04-08T19:15:13.930 に答える
1

テストすることはできませんが、構文は次のようになっていると思います。

validates_presence_of :shipping_cost, :shipping_cost_anywhere, :allow_blank => "true", :if => "shipping.nil?"

見る:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#conditional-validation

于 2012-05-08T15:22:13.373 に答える
0

これが私のコードです。比較するのではなく、if条件でメソッドを呼び出します。

 validates :prefix, :allow_blank => true, :uniqueness => { :case_sensitive => true } ,:if => :trunk_group_is_originating?


        def trunk_group_is_originating?
          if self.direction == "originating"
            true
          else
            false
          end
        end

お役に立てば幸いです。

于 2012-05-08T15:16:06.637 に答える