我有一個名為的模型Widget,它有一個名為advance.
a 的每個實體都Widget可能具有advance存盤唯一貨幣和金額的屬性。
盡管基于 gem 檔案設定了所有內容,并且能夠在默認貨幣之間USD切換和切換到其他貨幣,例如JPY, CSD, CNY,但切換到EUR會引發錯誤并阻止更新advance_currencyandadvance_cents值。
寶石檔案
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
架構
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
切換到日元的訊息(作品)
引數檢查
#<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.
我不知道為什么一種貨幣會拋出貨幣軌道 gem 操作,而其他貨幣則正常作業。
uj5u.com熱心網友回復:
似乎使用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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/464258.html
上一篇:Rails如何搜索下拉選擇
