Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails:验证和更改电话号码_Ruby On Rails_Validation - Fatal编程技术网

Ruby on rails RubyonRails:验证和更改电话号码

Ruby on rails RubyonRails:验证和更改电话号码,ruby-on-rails,validation,Ruby On Rails,Validation,我现在有一个简单的电话表单:phone是一种整数类型,因此这要求用户在表单中输入的任何内容必须类似于5551234,而不是更标准的555-1234如何允许用户输入他们习惯的美国电话号码?我知道我可以使用的validates\u format\u来验证它,但一旦我验证了它,我如何格式化号码并将电话号码作为整数插入数据库 "1-2-3-4".gsub('-','').to_i # => 1234 如果你想得到更多的乐趣,你也可以使用正则表达式,但是你应该能够做到这一点 您可能希望验证将其存储

我现在有一个简单的电话表单
:phone
是一种整数类型,因此这要求用户在表单中输入的任何内容必须类似于
5551234
,而不是更标准的
555-1234
如何允许用户输入他们习惯的美国电话号码?我知道我可以使用的
validates\u format\u来验证它,但一旦我验证了它,我如何格式化号码并将电话号码作为整数插入数据库

"1-2-3-4".gsub('-','').to_i
# => 1234
如果你想得到更多的乐趣,你也可以使用正则表达式,但是你应该能够做到这一点

您可能希望验证将其存储在DB中的内容,因为Rails在保存之前会检查验证。但是,您可以在验证之前执行
,首先修改数字。大概是这样的:

before_validation do
  phone = phone.to_s.gsub('-','').to_i
end


我们应该做到这一点。它删除非数字字符。

不确定您是否已经解决了这个问题,但我遇到了与Reti处理Mark代码时相同的问题

似乎是specific
self.phone=self.phone.gsub(/\D/,“”)
起了作用


可能是因为那时电话还没有初始化?我不确定,这里还是新手…

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

提到了两种覆盖模型中默认写访问器
(字段名称)=
的方法,以便您可以在需要进行类型转换之前处理输入,删除非数字。至少有三种变体:

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

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,就好像它是一个普通(非动态)方法一样(在文档中未显示,但可以使用):

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

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

这将在您的表中为您提供一个
bigint(20)
,它最多可以处理
9223372036854775807
,这对于任何电话号码都是足够的。

唯一的问题是,有些人喜欢键入
(123)555-1234
123-555-1234
(123)555-1234
,所以这个方法并不能得到所有的东西。在这种情况下,你可以使用正则表达式,它更强大。马克在回答中的例子很好地发挥了作用;phone=电话。至\u s.gsub(/\D/,'')。至\u i;在我的model.rb文件中结束
,但它仍然没有改变任何东西。正则表达式在irb Ruby 1.8.7中适用于我:
“(213)456-7890)。gsub(/\D/,“”)=>“2134567890”
有许多方法可以将整数格式化为电话号码。参见下面Josh提到的NumberHelper()或'phone'gem(),您需要说:
ruby self.phone=phone.gsub(…)
更新活动记录字段时需要'self';否则ruby会假定您只是设置了一个局部变量。回答得很好,@Niels。唯一的问题是,gsub!如果未进行任何更改,则返回nil。gsub与rails验证一起工作得更好。看见不过还是要谢谢你。你的回答让我开始了。Int/BigInt点+1。我从来没有想过这一点,不过(无论是好是坏),我通常会将我的电话号码存储为字符串。
def phone=(num)
  num.gsub!(/\D/, '') if num.is_a?(String)
  super(num)
end
<%= f.text_field :phone, number_to_phone(@model_data.phone) %>
change_column :model_name, :phone, :integer, :limit => 8