0

这是我的模型:

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。

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

4

2 回答 2

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 抱怨的线路的信息。

于 2013-08-29T03:45:45.293 回答
0

validates_format_of只是validates. 它需要一个实际的正则表达式,正如您在validates电话中提供的那样。由于您只是提供Regex class,我怀疑它会使您原本有效的validates呼叫无效。

于 2013-08-29T02:19:25.697 回答