2013-08-29 31 views
0

这里是我的模型:为什么在Rails中验证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。

任何想法我做错了什么?谢谢!

+1

正则表达式匹配192.168.1.1 – Fred

+0

我知道,这就是为什么我不确定为什么RoR会吐出这个错误? – naspinski

回答

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

+0

出于某种原因,即使我回滚并重新迁移,它仍然是一个整数? – naspinski

+0

*什么*是一个整数?这没有意义。 –

+0

@theTinMan IPv6建议非常好,但是你明白为什么他的测试失败了吗?无论如何,我会对你对我的回答的评估感兴趣。 –

0

validates_format_of只是validates的变种。它需要一个实际的正则表达式,正如你在validates调用中提供的那样。由于您只是提供Regex,我怀疑它是无效的,否则您的有效validates调用。

相关问题