想要实现
感谢收看。
我正在使用Rails开发。
我已经在模型上设置了验证,但是最大字符数的验证不能正常工作。
company.rb
validates :price,
length: { maximum: 23 },
presence: true,
numericality: true
像这样写,
然后使用以下形式:当输入23个字符(10000000000000000000000)时,验证将被触发
顺便说一下,22个字符(1000000000000000000000000)也通过了验证21个字符(1000000000000000000000000)通过验证
Form.vue
<template>
<main>
<form>
<fieldset>
<legend>price</legend>
<div class="form-row">
<b-form-input class="form-control" type="text"></b-form-input>
</div>
</fieldset>
</form>
</main>
</template>
schema.rb
create_table "companies", id: :bigint, unsigned: true, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
・
・
・
t.decimal "price", precision: 24, scale: 4
・
・
・
参数(当输入23个字符并捕获验证时)
Parameters: {"price"=>"10000000000000000000000"}
当我查看参数时,它们是字符串,所以我更改了控制器接收参数的位置,但它仍然无法验证。
def create_company_params
params.require(:company).permit(
).tap do |v|
v[:price] = v[:price].to_i
end
end
我不明白为什么验证中的最大字符数与我在模型中设置的不同。
如果你有什么建议,请告诉我。
环境Ruby 2.6Ruby on Rails 6.0
t.decimal "price", precision: 24, scale: 4
它会给你总共24位数字,小数点后面有4。
关于验证,如果你希望:price总是四位小数,你可以试试这个
validates :price, presence: true, format: { with: /Ad+(?:.d{4})?z/ }, numericality: { greater_than: 0, less_than: 999999999999999999999999 }
如果你希望:price最多有四位小数或更少(即:7,7.9,7.99,7.999,7.9999),你可以试试这个
validates :price, presence: true, format: { with: /Ad+(?:.d{0,4})?z/ }, numericality: { greater_than: 0, less_than: 999999999999999999999999 }
注意:less_than您可以指定db
中可以存储的最大数量如果你仍然看到问题,请关注这个博客
https://nelsonfigueroa.sh/handling-decimal-precision-in-rails/