4

I have Url model have url column and I want to validate that column to be a valid url, I have try with this:

class User < ActiveRecord::Base
    validates_format_of :url, :with => URI::regexp(%w(http https))
end

But when I enter this url: http://ruby3arabi it's accept it, any ideas?

AliOsm
  • 541
  • 2
  • 6
  • 20
  • 2
    This problem was deeply discussed here http://stackoverflow.com/questions/7167895/whats-a-good-way-to-validate-links-urls-in-rails – Semjon Jan 01 '16 at 23:36
  • Possible duplicate of [Rails: What's a good way to validate links (URLs)?](https://stackoverflow.com/questions/7167895/rails-whats-a-good-way-to-validate-links-urls) – Jon Schneider Sep 20 '17 at 14:21

3 Answers3

14

I tested and found that URI::regexp(%w(http https)) or URI::regexp are not good enough.

The troubleshooting is using this regular expression

/\A(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?\z/ix

Option:

  • i - case insensitive
  • x - ignore whitespace in regex
  • \A - start of regex (safely uses \A for Rails compares to ^ in common case)
  • \z - end of regex (safely uses \z for Rails compares to $ in common case)

So if you want to validate in model, you should use this instead:

class User < ApplicationRecord
  URL_REGEXP = /\A(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?\z/ix
  validates :url, format: { with: URL_REGEXP, message: 'You provided invalid URL' }
end

Test:

  • [1] URI::regexp(%w(http https))

    Test with wrong urls:

    • http://ruby3arabi - result is invalid
    • http://http://ruby3arabi.com - result is invalid
    • http:// - result is invalid

Test with correct urls:

Test with correct urls:

Test with correct urls:

Credit: Thanks noman tayyab, ref:Active Record Validations for update in case \A and \z

Martin K.
  • 1,168
  • 15
  • 16
4

I solved this problem with this gem https://github.com/ralovets/valid_url

AliOsm
  • 541
  • 2
  • 6
  • 20
2

You should consider using URI.parse: http://ruby-doc.org/stdlib-2.1.1/libdoc/uri/rdoc/URI.html#method-c-parse

Tyler
  • 51
  • 6