未正确激活小数最大值验证



想要实现

感谢收看。
我正在使用Rails开发。
我已经在模型上设置了验证,但是最大字符数的验证不能正常工作。


company.rb
validates :price,
length: { maximum: 20 },
presence: true,
numericality: true

像这样写,
然后使用以下形式:当输入20个字符(10000000000000000000)时,验证将被触发

顺便说一下,19个字符(1000000000000000000)也通过了验证18个字符(100000000000000000)通过验证

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
・
・
・

参数(当输入20个字符并捕获验证时)

Parameters: {"price"=>"10000000000000000000"}

当我查看参数时,它们是字符串,所以我更改了控制器接收参数的位置,但它仍然无法验证。

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

这是因为您使用的是decimal类型字段,而更多的字符存储在数据库字段中,这里有一个提示

instance.price = 123
instance.price.to_s # => '123.0'

您还指定了scale为4,这意味着该数字在整数部分(4位数字和一个点)之后可以有5个字符。

可能更适合您的用例的不是length,而是less_than_or_equal_to验证。

https://guides.rubyonrails.org/active_record_validations.html numericality

相关内容

  • 没有找到相关文章

最新更新