我在rails应用程序中使用money-rails
gem。
我有模型Transaction
。
class Transaction < ActiveRecord::Base
monetize :amount_money, as: :amount, with_model_currency: :currency, numericality: {greater_than_or_equal_to: 0}
end
用于添加新交易的表单。
= simple_form_for [:post_manager, @transaction] do |f|
= f.label t('activerecord.attributes.transaction.amount')
= f.input :amount, class: 'form-control'
= f.submit t('views.transactions.submit.create'), class: 'btn btn-md btn-success'
在我的控制器操作中:
def create
@transaction = Transaction.new(transaction_params)
@transaction.save
respond_with(@transaction, location: post_manager_transactions_path)
end
在我的资金初始化程序中:
MoneyRails.configure do |config|
config.register_currency = {
priority: 1,
iso_code: 'BYR',
name: 'Belarusian Ruble',
symbol: 'Br',
disambiguate_symbol: 'BYR',
subunit_to_unit: 1,
symbol_first: false,
decimal_mark: '.',
thousands_separator: ' ',
iso_numeric: '974',
smallest_denomination: 100
}
end
当我尝试添加新交易时:
在我的控制器操作中:
[1] pry(#<PostManager::TransactionsController>)> @transaction
=> #<Transaction:0x000001018ebfa0 id: nil, kind: "withdraw", amount_money: 12300, note: "vf", approved: nil, wallet_id: 1, category_id: 1, created_at: nil, updated_at: nil>
[2] pry(#<PostManager::TransactionsController>)> params
=> {"utf8"=>"✓",
"authenticity_token"=>"hAHFdamHK7CI41zXiHUCSb+RUg+57JR9sZTIhi2frcLEQELakQuOvhs8xaWMwK32XbxTsTfplCQJA7XigsueLQ==",
"transaction"=>{"kind"=>"withdraw", "category_id"=>"1", "amount"=>"123", "note"=>"vf"},
"commit"=>"Создать операцию",
"controller"=>"post_manager/transactions",
"action"=>"create"}
因此。在我的参数:金额是123,但在我的新交易中:金额是12300,所以我的金额金额字段中有2个额外的零。
我真的不知道如何解决它。也许以前有人遇到过这样的问题?
答案 0 :(得分:0)
这是money-rails
gem的预期行为。它会将货币金额保存在其最低面额中,以防止舍入错误。
由于您尚未指定您输入金额的货币,因此默认为USD
并将其转换为美分,这就是您看到该结果的原因:
$123 * 100 = 12300
宝石非常聪明,可以将货币金额转换为最低面额。但是,它需要知道它正在使用的货币,因为并非所有货币的行为都相同。
您接近此方式取决于您的应用程序逻辑。但是,作为测试,您可以在表单中添加以下隐藏字段,以产生您期望的结果。
= f.input :amount_currency, as: :hidden, input_html: { value: "BYR" }
→