我对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的最佳方法是什么?
此致 格温
答案 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]。