rails在保存之前删除非数字值

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

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 

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

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

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

否则,你可以覆盖这样的setter来删除非数字字符( 但它不会修复以’0’开头的电话号码 ):

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

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

您可以创建自定义方法来保存/显示手机号码,如下所示:

 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 

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

 def field=(value) super( value.delete('^0-9') ) end