2012-02-04 11 views
1

私はRailsにはかなり新しいです。これは初めてお金を使っています。私はお金の宝石ウィキに述べたように、私のモデルに以下のコードを挿入:私のデータベースでRuby on Railsお金の宝石:形からお金を作りなさい

composed_of :cash, 
:class_name => "Money", 
:mapping => [%w(amount cents), %w(currency currency_as_string)], 
:constructor => Proc.new { |cents, currency| Money.new(cents || 0, currency ||  Money.default_currency) }, 
:converter => Proc.new { |value| value.respond_to?(:to_money) ? value.to_money :  raise(ArgumentError, "Can't convert #{value.class} to Money") } 

私は2つのフィールドを持っている:金額(整数)と通貨(文字列)

を、私は、フォームを持っています、ユーザーが特定の現金金額を入力することができました。

<%= f.number_field :amount %> 

ここでの問題は、ユーザーが代わりに150セントの1,50のように自分の額を記入していることです。これをデータベースに挿入する前に、1,50から150のユーザー入力を変換する最善の方法は何ですか?

よろしく、 Gerwin

答えて

0

は、ドットでカンマを置き換えfloatとして解析し、100

("1,50".gsub(',', '.').to_f * 100).to_i 
# => 150 
0

によってオプションのカップルを掛けてご利用いただけます。あなたは値が、それはMoney.default_currencyで定義されたデフォルトの通貨以外の形式で入力された場合に入力されている通貨を認識する必要がありますすべての場合において

1)新しいcompos_ofアクセサを使用してください#cash

注:f.number_fieldメソッドは、テキストフィールドではなく数値スピンナを生成します。

2)#amountの定義をオーバーロードします。注意してください、私はこのメソッドがcompos_ofマクロの必要性を否定すると思います。

def amount 
    cents = read_attribute(:amount) || 0 
    currency = read_attribute(:currency_as_string) || Money.default_currency 
    Money.new(cents, currency) 
end 

def amount=(value) 
    cash = Money.from_string(value) 
    write_attribute(:amount, cash.cents) 
end 

documentationクラスメソッドMoney.from_ *を見てみましょう具体的には、方法Money.from_string[link] Aを見てみましょう。

関連する問題