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

Jas*_*ump 29 ruby regex ruby-on-rails-3

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

before_save { |workorder| workorder.phonenumber = 
                  phonenumber.to_s.gsub(/\D/, '').to_i }
Run Code Online (Sandbox Code Playgroud)

因此,如果用户输入

925-555-5555
Run Code Online (Sandbox Code Playgroud)

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

我也尝试过:

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

结果相同.

解决了:

def raw_phonenumber
  self.phonenumber
end
def raw_phonenumber=(s)
  self.phonenumber=s.gsub(/\D/, '')
end
Run Code Online (Sandbox Code Playgroud)

Bal*_*ick 59

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

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

change_column :table_name, :phonenumber, :string, limit: 30
Run Code Online (Sandbox Code Playgroud)

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

def phonenumber=(phonenumber)
  write_attribute(:phonenumber, phonenumber.gsub(/\D/, ''))
end
Run Code Online (Sandbox Code Playgroud)

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

  • 也许最好只使用`super`而不是`write_attribute`. (2认同)

Vin*_*sil 5

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

def field=(value)
  super(value.delete('^0-9'))
end
Run Code Online (Sandbox Code Playgroud)