首页 > 解决方案 > 未正确激活小数最大值的验证

问题描述

想要达到

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

标签: ruby-on-rails

解决方案


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

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

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

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

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


推荐阅读