我尝试在我的客户端模型中将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
答案 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