diff options
author | Robert Speicher <rspeicher@gmail.com> | 2015-12-01 18:45:36 -0500 |
---|---|---|
committer | Robert Speicher <rspeicher@gmail.com> | 2015-12-07 16:57:26 -0500 |
commit | d5ea93469b4ec95916361c61876c949f60539211 (patch) | |
tree | a2a91371b4709725734016910ffb782b2dfd45a2 /app/validators | |
parent | 2928e19d4356683119cf0d2bb269752253ea5d50 (diff) | |
download | gitlab-ce-d5ea93469b4ec95916361c61876c949f60539211.tar.gz |
Add custom UrlValidator
Diffstat (limited to 'app/validators')
-rw-r--r-- | app/validators/url_validator.rb | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/app/validators/url_validator.rb b/app/validators/url_validator.rb new file mode 100644 index 00000000000..2848b9cd33d --- /dev/null +++ b/app/validators/url_validator.rb @@ -0,0 +1,36 @@ +# UrlValidator +# +# Custom validator for URLs. +# +# By default, only URLs for the HTTP(S) protocols will be considered valid. +# Provide a `:protocols` option to configure accepted protocols. +# +# Example: +# +# class User < ActiveRecord::Base +# validates :personal_url, url: true +# +# validates :ftp_url, url: { protocols: %w(ftp) } +# +# validates :git_url, url: { protocols: %w(http https ssh git) } +# end +# +class UrlValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + unless valid_url?(value) + record.errors.add(attribute, "must be a valid URL") + end + end + + private + + def default_options + @default_options ||= { protocols: %w(http https) } + end + + def valid_url?(value) + options = default_options.merge(self.options) + + value =~ /\A#{URI.regexp(options[:protocols])}\z/ + end +end |