使用money-rails gem,将实例货币切换为欧元会中断更新



我有一个名为Widget的模型,它有一个名为advance的货币化属性。

Widget的每个实例可以有一个advance属性,该属性存储唯一的货币和金额。

尽管基于gem文档设置了所有内容,并且能够在默认货币USD和切换到其他货币(如JPY,CSD,CNY)之间切换,切换到EUR会抛出错误并阻止更新advance_currencyadvance_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>

最新更新