当用户在 Rails 6 上的 Ruby 中输入错误时,如何不将字符串转换为 0?

How to not convert a string to 0 while user makes a wrong input in Ruby on Rails 6?

我有一个模型,我想在其中验证用户进行的拧紧次数。它必须只是一个非负整数。问题是当我输入一个字符串时,它会在应用正则表达式之前保存时自动用 0 替换一个字符串。如何在不将字符串转换为 0 的情况下强制输入仅为非负整数?

class User < ApplicationRecord
  validates :number_of_tightenings, format: { with: /\A[0-9]+\z/,
    message: "You have to input a number >= 0." }
end

您可以使用 ActiveRecord 的数字验证。 (https://edgeguides.rubyonrails.org/active_record_validations.html#numericality)

class User < ApplicationRecord
  validates :number_of_tightenings,
    numericality: { only_integer: true, greater_than_or_equal_to: 0 }
end

# schema.rb
t.integer "number_of_tightenings"

only_integer 指定它应该是整数(不是浮点数)。 greater_than_or_equal_to 指定不允许负整数。 这将产生以下行为:

User.create(number_of_tightenings: 4) #=> <User id: 8, number_of_tightenings: 4, created_at: "2020-12-16 12:03:47", updated_at: "2020-12-16 12:03:47">
User.create(number_of_tightenings: "5") #=> <User id: 6, number_of_tightenings: 5, created_at: "2020-12-16 11:54:39", updated_at: "2020-12-16 11:54:39">
User.create(number_of_tightenings: "-5") #=> <ActiveModel::Errors:0x00007faa18df2180 @base=#<User id: nil, number_of_tightenings: -5, created_at: nil, updated_at: nil>, @messages={:number_of_tightenings=>["must be greater than or equal to 0"]}, @details={:number_of_tightenings=>[{:error=>:greater_than_or_equal_to, :value=>-5, :count=>0}]}>
User.create(number_of_tightenings: "test") #=> <ActiveModel::Errors:0x00007faa182836c8 @base=#<User id: nil, number_of_tightenings: 0, created_at: nil, updated_at: nil>, @messages={:number_of_tightenings=>["is not a number"]}, @details={:number_of_tightenings=>[{:error=>:not_a_number, :value=>"test"}]}>