Money-Rails在小数点后丢弃价格金额

时间:2018-03-07 16:34:04

标签: ruby-on-rails ruby rubygems ruby-on-rails-5 money-rails

我正在构建和Rails 5 API,我试图发送金额并将其存储在PostgresQL数据库中。我发送的数量为2.4,但我在数据库中只看到2存储。我做错了什么?

我的迁移:

class CreateTransactions < ActiveRecord::Migration[5.1]
  def change
  create_table :transactions do |t|
   t.monetize :transaction_price, amount: { null: true, default: nil }
   t.timestamps
  end
 end
end

我的模特是:

class Transaction < ApplicationRecord
  monetize :transaction_price_cents
end

我的控制员:

class TransactionsController < ApiController
      def create
        transaction = Transaction.new(transaction_param)
        if transaction.save
          render json: { status: 'SUCCESS', data:transaction }, status: :ok
        end
      end

      private
      def transaction_param
        params.require(:transaction).permit(:transaction_price_cents)
      end
end

我和邮递员一起发送这个json:

{
    "transaction_price_cents": 345.23
}

我得到的回应是:

{
    "status": "SUCCESS",
    "data": {
        "id": 1,
        "transaction_price_cents": 345,
        "transaction_price_currency": "USD",
    }
}

我要么需要345.23或34523,但它只给我345个!

1 个答案:

答案 0 :(得分:1)

你的价格在美分!那没关系!

以美分处理货币是一种常见的模式。当涉及到税收或货币兑换的错误时,它也会挽救你的生命。就像他们提到的文档一样,你应该使用帮助器以人类可读的形式输出价格:

prowatchContext

如果您通过API访问数据,则可以在api中添加human_readable字段

humanized_money @money_object                       # => 6.50
humanized_money_with_symbol @money_object           # => $6.50
money_without_cents_and_with_symbol @money_object   # => $6

保存/创建模型:如果您得到一个浮动数字,您可以将浮点数更改为美分before_save

def transaction_price_human_readable
  return humanized_money_with_symbol(@money_object) # or self or...
end