Ruby on Rails Money gem:从表单中创造金钱

时间:2012-02-04 20:49:34

标签: ruby-on-rails ruby gem

我对Rails很新,这是我第一次使用金钱git。我将以下代码插入到我的模型中,如money gem wiki中所述:

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") }

在我的数据库中,我有两个字段:金额(整数)和货币(字符串)

我还有一个表格,用户可以输入一定的现金金额:

<%= f.number_field :amount %>

这里的问题是用户填写的数量为1,50而不是150美分。在将用户输入插入数据库之前,将用户输入1,50转换为150的最佳方法是什么?

此致 格温

2 个答案:

答案 0 :(得分:0)

用逗号替换逗号,解析为浮点数并乘以100。

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

答案 1 :(得分:0)

有几种选择。

在所有情况下,您都需要了解输入值的货币如果,则输入的格式不是Money.default_currency中定义的默认货币。< / p>

1)使用新的composition_of访问者#cash

<%= f.number_field :cash %>

注意:f.number_field方法生成一个数字微调器而不是文本字段。

2)重载#amount的定义。请注意,我认为这种方法无需使用composition_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]