Ruby rails会在保存前剥离非数值

Ruby rails会在保存前剥离非数值,ruby,regex,ruby-on-rails-3,Ruby,Regex,Ruby On Rails 3,我已经搜索过了,看起来这应该很简单,但我无法让它工作。我试图在保存电话号码之前删除所有非数字字符。这就是我目前拥有的: before_save { |workorder| workorder.phonenumber = phonenumber.to_s.gsub(/\D/, '').to_i } 所以如果用户输入 925-555-5555 它应该保存925555,但实际上只保存了925,并且忽略了之后的所有内容 我还尝试: before_save { |

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

before_save { |workorder| workorder.phonenumber = 
                  phonenumber.to_s.gsub(/\D/, '').to_i }
所以如果用户输入

925-555-5555
它应该保存925555,但实际上只保存了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
列定义为number。这就是为什么当您在
phonenumber
属性中设置
'925-555-5555'
时,它被转换为一个数字,并且只保留
925

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

change_column :table_name, :phonenumber, :string, limit: 30
否则,您可以像这样覆盖setter以删除非数字字符(,但它不会修复以“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  
def移动电话号码(arg)
如果参数为downcase.include?(特殊字符)
电话号码=arg.downcase.split('特殊字符')
电话=如果电话号码[0]。to|i==0 | |电话号码[0]。to|i.to|s.size<10
电话号码(电话号码[0]。gsub!(/[^0-9A-Za-z]/,“”)。电话号码,区号:true)
其他的
电话号码至电话号码(电话号码[0]。至电话号码,区号:true)
结束
return phone.to_s+“Ext”+删除不必要的关键字(电话号码[1])
elsif arg.include(“(”)| | arg.include(“))| | arg.include(“-”)|
arg.include.| | arg.include.(“”)
返回电话号码(arg.gsub!(/[^0-9A-Za-z]/,'')。返回i,区号:true)
其他的
返回电话号码(arg.to_i,区号:true)
结束
结束

最简单的方法是改变
字段=
方法:

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

应该是
workorder.phonenumber.to_.s.gsub(/[^0-9]/,“”)。to_i
??您缺少
工作顺序
(如果这是您的实际代码)什么数据类型是phonenumber?您的输入被转换为整数,因为您的db表:“925-555-5555”.to_i#=>925i最终使用了基于您的解决方案的getter和setter方法。也许最好只使用
super
而不是
write_属性
。根据文档,
super
是一种方法。Upvoting用于将电话号码存储为字符串。这不是一个你会做数学运算的数字,如果不以字符串形式存储,会让你感到非常头疼。一般来说,如果答案中包含对代码意图的解释,以及在不引入其他代码的情况下解决问题的原因,那么答案会更有帮助。
def field=(value)
  super(value.delete('^0-9'))
end