我有一个名为Widget
的模型,它有一个名为advance
的货币化属性。
Widget
的每个实例可以有一个advance
属性,该属性存储唯一的货币和金额。
尽管基于gem文档设置了所有内容,并且能够在默认货币USD
和切换到其他货币(如JPY
,CSD
,CNY
)之间切换,切换到EUR
会抛出错误并阻止更新advance_currency
和advance_cents
值。
Gem文件
ruby "3.1.2"
gem "rails", "7.0.2.3"
gem "money-rails", "1.15.0"
初始化文件Money.locale_backend = :currency
MoneyRails.configure do |config|
config.default_currency = :usd
config.include_validations = true
config.rounding_mode = BigDecimal::ROUND_HALF_UP
end
迁移设置create_table :widgets, force: :cascade do |t|
...
t.monetize :advance, amount: { limit: 8 }
end
<<h2>模式/h2>create_table "widgets", force: :cascade do |t|
...
t.bigint "advance_cents", default: 0, null: false
t.string "advance_currency", default: "USD", null: false
...
end
模型设置class Widget < ApplicationRecord
...
monetize :advance_cents, with_model_currency: :advance_currency
...
end
编辑表单视图片段
<div class="form-floating">
<%= select_tag("advance_currency", options_for_select(CurrencyTypes.options_for_select, @instance.advance_currency), prompt: "Select a currency", class: "form-select") %>
<label for="advance_currency" class="form-label">Advance Currency</label>
</div>
<div class="form-floating">
<input type="number" step="any" class="form-control" id="advance" name="advance" value="<%= number_to_currency(@instance.advance, unit: "", separator: ".") %>">
<label for="advance" class="form-label">Advance Amount</label>
</div>
控制器更新动作
def update
instance = controller_class.find(params[:id])
instance.update(update_params)
...
end
private
def update_params
params.permit(
...
:advance,
:advance_currency,
...
)
end
消息切换到日元(Works)
参数检查#<ActionController::Parameters {
...
"advance_currency"=>"JPY",
"advance"=>"987.65",
} permitted: false>
调试更新> instance.update(update_params)
> instance.save
true
调试错误> instance.errors
#<ActiveModel::Errors []>
切换到欧元(不工作)的错误信息
参数检查#<ActionController::Parameters {
...
"advance_currency"=>"EUR",
"advance"=>"123.45",
} permitted: false>
调试更新> instance.update(update_params)
> instance.save
false
调试错误> instance.errors
#<ActiveModel::Errors [#<ActiveModel::Error attribute=advance, type=invalid_currency, options={:thousands=>".", :decimal=>",", :currency=>"123.45", :attribute=>"Advance"}>]>
没有任何意义的是,当切换到欧元作为货币时,预支金额似乎被输入currency
值而不是EUR
。
我不知道为什么一个货币抛出货币轨道宝石操作,而其他工作正常。
似乎使用number
类型输入是问题所在。
您只能以123.456,78
格式提交欧元值,而不能以123,456.78
格式提交其他货币。
由于number
输入类型中不允许使用逗号,因此必须切换到text
不工作
<div class="form-floating">
<input type="number" class="form-control" id="advance" name="advance" value="<%= @instance.advance %>">
<label for="advance" class="form-label">Advance Amount</label>
</div>
<div class="form-floating">
<input type="text" class="form-control" id="advance" name="advance" value="<%= @instance.advance %>">
<label for="advance" class="form-label">Advance Amount</label>
</div>
<div class="form-floating">
<input type="text" class="form-control" id="advance" name="advance" value="<%= @instance.advance %>">
<label for="advance" class="form-label">Advance Amount</label>
</div>