【问题标题】:Ruby on Rails Money gem: create money from formRuby on Rails Money gem:从表单中赚钱
【发布时间】:2012-02-04 20:49:34
【问题描述】:

我对 Rails 很陌生,这是我第一次使用 money 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 的最佳方法是什么?

问候, 格温

【问题讨论】:

    标签: ruby-on-rails ruby gem


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      有几个选项可供选择。

      在所有情况下,您都需要了解输入值所使用的货币如果以不同于Money.default_currency 中定义的默认货币的格式输入。

      1) 使用新的composer_of 访问器#cash

      <%= f.number_field :cash %>
      

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

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

      【讨论】:

        猜你喜欢
        • 2015-07-20
        • 2015-02-04
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-15
        • 2015-08-29
        • 1970-01-01
        相关资源
        最近更新 更多