Подтвердить что ты не робот

Rails 3: проверка IP-строки

В Rails 3 есть встроенный метод для просмотра, является ли строка допустимым IP-адресом?

Если нет, то какой самый простой способ проверить?

4b9b3361

Ответ 1

Способ Rails для проверки с помощью ActiveRecord в Rails 3:

@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 :gateway, 
          :presence => true, 
          :uniqueness => true,
          :format => { :with => @ip_regex } 

Хороший ресурс здесь: Wayback Archive - проверка электронной почты в Ruby On Rails 3 или активной модели без регулярного выражения

Ответ 2

Просто хотел добавить, что вместо написания собственного шаблона вы можете использовать сборку в одном Resolv::IPv4::Regex

require 'resolv'

validates :gateway, :presence => true, :uniqueness => true,
  :format => { :with => Resolv::IPv4::Regex }

Ответ 3

Вы также можете просто вызвать стандартную библиотеку IPAddr.new, которая будет анализировать подсети, IPV6 и другие интересные вещи: (IPAddr) и верните nil, если формат был неправильным.

Просто выполните:

valid = !(IPAddr.new('192.168.2.0/24') rescue nil).nil?  
#=> true

valid = !(IPAddr.new('192.168.2.256') rescue nil).nil?  
#=> false

Ответ 4

Вы можете использовать Resolv::IPv4::Regex как Джек, упомянутый ниже, если вам не нужно принимать подсети.

Если вам нужно его принять, activemodel-ipaddr_validator gem может вам помочь. (отказ от ответственности: я автор драгоценного камня)

validates :your_attr, ipaddr: true

Ответ 5

Я не знаю о RoR много, но если вы не нашли встроенный метод для проверки IP-адреса.

Попробуйте это регулярное выражение:

"^([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}$"

для проверки IP-адреса.

Недавно я использовал его в одном модуле, чтобы он был на рабочем столе.

Ответ 6

Вы должны использовать Regular Expression

Вот тот, который делает то, что вы хотите:

/^([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}$/.match("#{@systemIP}")

Ответ 7

Вы также можете использовать Regexy:: Web:: IPv4, который также может соответствовать IP-адресам с номерами портов.