ruby-on-rails – Ruby on Rails:验证和更改电话号码

我有一个简单的电话表格<%= f.text_field:phone%>马上. :手机是一个整数类型,所以这要求用户输入表格必须是5551234,而不是更标准的方式555-1234我如何允许用户输入像他们习惯的美国电话号码?我知道我可以使用validates_format_of来验证它,但是一旦我验证它,我如何格式化数字并将电话号码作为整数插入数据库

解决方法

ActiveRecord根据数据库列类型自动进行类型转换.当 Ruby字符串转换为整数时,它会在第一个非数字字符后丢弃所有内容,123-456-7890将变为123.这在字段在模型中可用之前完成,因此到目前为止给出的解决方案将不起作用.您需要覆盖认的写访问器!

ActiveRecord::Base docs提到了在模型中覆盖认写入访问器(field_name)=的两种方法,因此您可以在需要进行类型转换之前处理删除非数字的输入.至少有三种变化:

(1)覆盖访问器并使用write_attribute将结果存储在数据库中:

def phone=(value)
  value.gsub!(/\D/,'') if value.is_a?(String)
  write_attribute(:phone,value.to_i)
end

(2)或使用哈希表示法:

def phone=(num)
  num.gsub!(/\D/,'') if num.is_a?(String)
  self[:phone] = num.to_i
end

(3)或者(在ActiveRecord的最新版本中)只需调用super就好像它是一个普通的(非动态的)方法(在docs中没有显示但是有效):

def phone=(num)
  num.gsub!(/\D/,'') if num.is_a?(String)
  super(num)
end

这在许多情况下非常有用,例如带逗号的数字,并且对于提供前一字段值的格式化版本的表单非常有用,例如在编辑表单中或在新/创建表单中出错之后:

<%= f.text_field :phone,number_to_phone(@model_data.phone) %>

这样,您可以显示用户格式化的数据(即String),但仍然在数据库中存储整数.

关于MysqL的最后一个提示:您需要使用BigInt存储电话号码,否则您将在数据库中看到很多(214)748-3647电话号码,因为2,147,483,647是正常MysqL整数的最大值 – int(11 ) – 获得的形式:迁移中的整数. MysqL中的BigInt是通过将limit限制为8获得的,如此迁移行中所示:

change_column :model_name,:phone,:integer,:limit => 8

这将给你一个bigint(20)在你的表中,可以处理多达9,223,372,036,854,775,807的数字,这应该足够任何电话号码.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...