7

私のモデルで使用しているものは次のとおりです。

before_validation :strip_dollar_sign

validates :amount_due,
          :format => { :with => /^\d+??(?:\.\d{0,2})?$/ }, 
          :numericality => {:greater_than => 0}

private

def strip_dollar_sign
  self.amount_due = self.amount_due.to_s.tr!('$,','').to_f
end

Rails コンソールで strip_dollar_sign 関数の行を手動で実行すると、まさに希望どおりの結果が得られます (つまり、$400 は最終的に 400.0 になります) が、アプリで実際のフォームを使用すると、値は常に 0.0 になります。誰かが私が間違っていることをキャッチしますか?

4

3 に答える 3

17

ここでの 3 つの問題:

  • Stefan がanswerで指摘したよう,に、呼び出しでを削除したい場合がありますtr!が、 の置換には影響しません$

  • tr!を使用しており、その戻り値を間違った方法で使用しています。tr!(Ruby の!メソッド バリアントのほとんどと同様に) 文字列をインプレースでnil変更し、変更が行われていない場合は戻ります。nil.to_fisであるため0.0、それが得られる理由です (または、そうでない場合もあります。以下を参照してください)。代わりに を使用する必要がありますtr

  • Rails は、代入引数をそれに関連付けられたデータベース列の正しい型に自動的に変換します。そのため、検証の前であっても、値は float に変換され、"$400".to_fis0.0であり、それがコールバックに表示されます。amount_due=解決策は、コールバックを使用する代わりにオーバーライドすることです。

    def amount_due=(value)
      value = value.to_s.tr('$', '').to_f
      write_attribute(:amount_due, value)
    end
    
于 2012-06-18T14:26:46.600 に答える
3

の後にコンマがあるので、代わりに$削除しています。$,$

于 2012-06-18T14:17:31.390 に答える
-2

これを JavaScript で行うことをお勧めします。Rails は、フォーム ヘルパーを使用して、数値データベース タイプに基づくフィールド内の数値以外の値を 0.0 に変換する魔法を行っているようです。ばか、私は知っています。

于 2014-02-13T00:55:59.697 に答える