2013-08-29 57 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調用。

相關問題