29

我已经搜索过了,看起来这应该很简单,但我无法让它工作。我试图在保存电话号码之前删除所有非数字字符。这是我目前拥有的:

before_save { |workorder| workorder.phonenumber = 
                  phonenumber.to_s.gsub(/\D/, '').to_i }

所以如果用户输入

925-555-5555

它应该保存 9255555555 但它实际上只保存 925 并忽略之后的所有内容

我也试过:

before_save { |workorder| workorder.phonenumber = 
                  phonenumber.to_s.gsub(/[^0-9]/, "").to_i }

结果相同。

解决了:

def raw_phonenumber
  self.phonenumber
end
def raw_phonenumber=(s)
  self.phonenumber=s.gsub(/\D/, '')
end
4

3 回答 3

62

您当然已将phonenumber列定义为数字。这就是为什么当你'925-555-5555'phonenumber属性中设置时,它被转换为一个数字,并且只925保留。

最好的解决方案是将数据库中列的类型更改为string. 创建一个新的迁移:

change_column :table_name, :phonenumber, :string, limit: 30

否则,您可以像这样覆盖设置器以删除非数字字符(但它不会修复以 '0's 开头的电话号码):

def phonenumber=(phonenumber)
  write_attribute(:phonenumber, phonenumber.gsub(/\D/, ''))
end

此博客文章中的更多替代方案

于 2012-09-28T18:23:01.510 回答
4

最简单的方法是改变field=方法:

def field=(value)
  super(value.delete('^0-9'))
end
于 2018-09-10T00:17:36.880 回答
0

您可以像这样创建保存/显示手机号码的自定义方法:

def mobile_number(arg)

if arg.downcase.include?('special chars')

phone_number = arg.downcase.split('special chars')

phone = if phone_number[0].to_i == 0 || phone_number[0].to_i.to_s.size < 10
number_to_phone(phone_number[0].gsub!(/[^0-9A-Za-z]/, '').to_i, area_code: true)
else
number_to_phone(phone_number[0].to_i, area_code: true)
end

return phone.to_s + ' Ext'+ remove_unnecessary_keywords(phone_number[1])

elsif arg.include?('(') || arg.include?(')') || arg.include?('-') || 
arg.include?('.') || arg.include?(' ')

return  number_to_phone(arg.gsub!(/[^0-9A-Za-z]/, '').to_i, area_code: true)    

else

return number_to_phone(arg.to_i, area_code: true) 

end

end  
于 2018-05-25T10:21:38.330 回答