在 Rails 中删除 Phone 验证前输入的数字

Strip Phone Number Input Before Validation in Rails

我正在尝试将我的客户端模型中的 contact_phone 列设置为整数数据类型。我仍然希望能够允许用户以他们喜欢的任何格式(即 999-999-9999 或 999.999.9999)输入 phone 数字,并在将其验证为有效之前删除任何非数字字符phone个。

不幸的是,Rails 似乎不允许我在验证前对数据进行 运行 gsub,因为它是 FixNum 数据类型。这是否意味着我必须在数据库中将其设为字符串以允许用户在验证之前输入非数字字符?

我的客户模型:

  before_validation :strip_contact_phone

  protected  

  def strip_contact_phone
    self.contact_phone = self.contact_phone.gsub(/[^0-9]/, '') 
  end

以及在尝试保存新客户端时出现的错误:

undefined method `gsub' for 646:Fixnum

使用整数列类型是有问题的,因为 Rails 对数据库支持的属性的分配(和检索)执行类型转换。这意味着,当您尝试将字符串分配给整数字段时,您将对字符串进行类型转换并丢失数据。例如:

"123-123-1234".to_i # => 123

所以这就是你有 undefined method 'gsub' for 646:Fixnum 的原因。 Rails 已经对用户输入的 phone 数字字符串进行了类型转换,将值截断为 646,是的,gsub 不是 Fixnum 的有效方法。所以肯定要把phone数字列类型改成String。然后你就可以自由地执行你的 gsub 并且 phone 数字不会被预先截断。

def strip_contact_phone
  self.contact_phone.gsub!(/[^0-9]/, '')
end