ruby - rails 在保存前去除非数值

标签 ruby regex ruby-on-rails-3

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

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

blog post 中的更多选择

关于ruby - rails 在保存前去除非数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12645083/

相关文章:

ruby - 在 jekyll 博客中支持标签的简单方法

c# - 如何使用正则表达式处理长电子邮件地址?

ruby-on-rails-3 - has_secure_password : how to require minimum length

ruby - 错误:执行 gem ... (Errno::EACCES) 权限被拒绝 @ rb_sysopen -/path/to/my/ruby global/wrappers/cert

ruby - Thor 阅读配置 yaml 文件以覆盖选项

python - 正则表达式的行为不符合预期

ruby-on-rails-3 - Rails link_to_add 生产失败

ruby - Rails 3 - 查找条件以过滤损坏的引用完整性关联

ruby - 在实例方法中使用 mixin 方法

正则表达式,选择以我的条件开头的行,但只取空格后的字符