app/mixins/open_conference_ware/normalize_url_mixin.rb
module OpenConferenceWare
module NormalizeUrlMixin
def self.included(mixee)
mixee.send(:extend, ClassMethods)
mixee.send(:include, ClassMethods)
end
module ClassMethods
# Return a normalized URL, with the scheme prefix added, or raise an
# URI::InvalidURIError if invalid.
def normalize_url!(url)
uri = URI.parse(url.strip)
uri.scheme = 'http' unless ['http','ftp'].include?(uri.scheme) || uri.scheme.nil?
return URI.parse(uri.scheme.nil? ? 'http://'+url.strip : uri.to_s).normalize.to_s
end
# Validate that +attributes+ each contain a valid URL or are blank. If any
# are invalid, returns false. Invalid attributes will be marked with an
# ActiveRecord validation error.
def validate_url_attribute(*attributes)
valid = true
for attribute in [attributes].flatten
value = self.read_attribute(attribute)
next if value.blank?
begin
url = self.normalize_url!(value)
self.send("#{attribute}=", url)
rescue URI::InvalidURIError => e
self.errors.add(attribute, 'is invalid')
valid = false
end
end
return valid
end
end
include ClassMethods
extend ClassMethods
end
end