我已经搜索了,看起来这应该很简单,但我无法让它工作。我想在保存电话号码之前删除所有非数字字符。这就是我目前所拥有的:
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
答案 0 :(得分:57)
您当然已将phonenumber
列定义为数字。这就是为什么当您在'925-555-5555'
属性中设置phonenumber
时,它会被转换为一个数字,并且只保留925
。
最佳解决方案是将数据库中列的类型更改为string
。创建新迁移:
change_column :table_name, :phonenumber, :string, limit: 30
否则,您可以覆盖此类设置器以删除非数字字符(但不会修复以'0 开头的电话号码):
def phonenumber=(phonenumber)
write_attribute(:phonenumber, phonenumber.gsub(/\D/, ''))
end
中的更多替代方案
答案 1 :(得分:2)
最简单的方法是更改field=
方法:
def field=(value)
super(value.delete('^0-9'))
end
答案 2 :(得分: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