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?
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:
\A
for Rails compares to ^
in common case)\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:
Test with correct urls:
http://ruby3arabi.com - result is invalid
http://www.ruby3arabi.com - result is invalid
https://www.ruby3arabi.com - result is invalid
https://www.ruby3arabi.com/article/1 - result is invalid
https://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - result is invalid
[2] URI::regexp
Test with wrong urls:
Test with correct urls:
http://ruby3arabi.com - result is valid
http://www.ruby3arabi.com - result is valid
https://www.ruby3arabi.com - result is valid
https://www.ruby3arabi.com/article/1 - result is valid
https://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - result is valid
[3] /^(http|https)://[a-z0-9]+([-.]{1}[a-z0-9]+).[a-z]{2,5}(:[0-9]{1,5})?(/.)?$/ix
Test with wrong urls:
Test with correct urls:
Credit: Thanks noman tayyab, ref:Active Record Validations for update in case \A
and \z
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With