Add http(s) to URL if it's not there? Add http(s) to URL if it's not there? ruby ruby

Add http(s) to URL if it's not there?


Use a before filter to add it if it is not there:

before_validation :smart_add_url_protocolprotecteddef smart_add_url_protocol  unless url[/\Ahttp:\/\//] || url[/\Ahttps:\/\//]    self.url = "http://#{url}"  endend

Leave the validation you have in, that way if they make a typo they can correct the protocol.


Don't do this with a regex, use URI.parse to pull it apart and then see if there is a scheme on the URL:

u = URI.parse('/pancakes')if(!u.scheme)  # prepend http:// and try againelsif(%w{http https}.include?(u.scheme))  # you're okayelse  # you've been give some other kind of  # URL and might want to complain about itend

Using the URI library for this also makes it easy to clean up any stray nonsense (such as userinfo) that someone might try to put into a URL.


The accepted answer is quite okay.But if the field (url) is optional, it may raise an error such as undefined method + for nil class.The following should resolve that:

def smart_add_url_protocol  if self.url && !url_protocol_present?    self.url = "http://#{self.url}"  endenddef url_protocol_present?  self.url[/\Ahttp:\/\//] || self.url[/\Ahttps:\/\//]end