为什么验证IP使Rails无效?

时间:2013-08-29 02:02:17

标签: ruby-on-rails ruby ip

这是我的模特:

require 'resolv'
class Profile < ActiveRecord::Base

  @ip_regex = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/

  validates :ip, :dns, :ntp, :format => { :with => @ip_regex } 
  validates_format_of :ip, :dns, :ntp, :with => Resolv::IPv4::Regex

end

正如你所看到的,我正在尝试两种方式,这两种方式都给了我:

xxx is invalid

对于输入,我只是尝试:192.168.1.1

我正在使用Ruby 1.8.7和Rails 3.0.3。

知道我做错了什么吗?谢谢!

2 个答案:

答案 0 :(得分:1)

由于IPv4空间耗尽,IPv6将变得越来越普遍。不要依赖IPv4正则表达式,而是使用IPAddr并依靠经过良好测试的轮子来告诉您它是否是有效的IP,无论它是IPv4还是v6。

IPAddr将提出:

IPAddr::InvalidAddressError: invalid address

类似于:

require 'ipaddr'
IPAddr.new('292.168.1.1')

如果它是有效的v4或v6,它将通过。


关于Rails拒绝IP号码的原因:您有两个单独的验证,但是您没有显示哪个会引发您看到的错误。基本调试说要注释掉一个,看看问题是否消失或继续发生。一旦你这样做,你可以深入挖掘以找出问题。因此,您不会向我们提供有关Rails抱怨哪一行的任何信息。

答案 1 :(得分:0)

validates_format_of只是validates的变体。正如您在validates电话中提供的那样,它需要一个真正的正则表达式。由于您只是提供Regex ,我怀疑它会使您的其他有效validates电话无效。