想要实现
感谢收看。
我正在使用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