在Rails中验证之前删除电话号码输入

时间:2015-02-20 03:54:07

标签: ruby-on-rails validation

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

不幸的是,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

1 个答案:

答案 0 :(得分:2)

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

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

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

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