ruby-on-rails - 未正确激活小数最大值的验证
问题描述
想要达到
感谢收看。
我正在使用 Rails 进行开发。
我已经在模型上设置了验证,但是最大字符数的验证不能正常工作。
公司.rb
validates :price,
length: { maximum: 20 },
presence: true,
numericality: true
像这样写,
然后使用表单输入20个字符(10000000000000000000)时验证将被触发。
顺便说一句,19 个字符(1000000000000000000)也通过了验证,18 个字符(100000000000000000)通过了验证。
表单.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>
架构.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.6 Ruby on Rails 6.0
解决方案
这是因为您正在使用decimal
类型字段,并且更多字符存储在数据库字段中,这里有一个提示
instance.price = 123
instance.price.to_s # => '123.0'
您还指定了scale
4 的 a,这意味着该数字在整数部分之后可以有 5 个字符(4 位数字和一个点)。
可能更适合您的用例的不是验证length
,而是less_than_or_equal_to
验证。
https://guides.rubyonrails.org/active_record_validations.html#numericality
推荐阅读
- android - 如何在 RecyclerView 适配器中使用 getLifecycle().addObserver()
- android - 跳过了 844 帧!带有 Spinner 的简单 AlertDialog 导致 MainThread 中的工作过多
- javascript - Wrapper 函数破坏了 socket.io 函数
- firebase-realtime-database - 如何将 Firebase RTDB snapshot.value 传输到 Dart/Flutter 类实例
- android - 必应图像搜索 API 失败
- javascript - 我的开关有问题。它工作一次但不是两次
- ios - 子规范 vendored_frameworks 作为另一个 cocoapod 库
- rust - 为什么 serde_json::to_writer 不要求它的参数是 `mut`?
- rest - Graphql 是否比 Rest API 提供任何性能提升?
- python - 如何在不下载的情况下从 Google Cloud Storage 读取视频?使用视频网址