AliOsm
AliOsm

Reputation: 551

How to validate url in rails model?

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?

Upvotes: 4

Views: 11173

Answers (3)

Martin K.
Martin K.

Reputation: 1258

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

Upvotes: 14

AliOsm
AliOsm

Reputation: 551

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

Upvotes: 4

Tyler
Tyler

Reputation: 51

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

Upvotes: 2

Related Questions