(мне нравится ответ Томаса Хупкенса, но для просмотра другими людьми я рекомендую Addressable)
Не рекомендуется использовать регулярные выражения для проверки URL.
Используйте библиотеку URI Ruby или ее замену, например Addressable , что делает проверку URL тривиальной. В отличие от URI, Addressable также может обрабатывать международные символы и tlds.
Пример использования:
require 'addressable/uri'
Addressable::URI.parse("кц.рф") # Works
uri = Addressable::URI.parse("http://example.com/path/to/resource/")
uri.scheme
#=> "http"
uri.host
#=> "example.com"
uri.path
#=> "/path/to/resource/"
И вы можете создать пользовательскую проверку, например:
class Example
include ActiveModel::Validations
##
# Validates a URL
#
# If the URI library can parse the value, and the scheme is valid
# then we assume the url is valid
#
class UrlValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
begin
uri = Addressable::URI.parse(value)
if !["http","https","ftp"].include?(uri.scheme)
raise Addressable::URI::InvalidURIError
end
rescue Addressable::URI::InvalidURIError
record.errors[attribute] << "Invalid URL"
end
end
end
validates :field, :url => true
end
Кодовый источник