这是我的模特:
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。
知道我做错了什么吗?谢谢!
答案 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
电话无效。