class EnsureSubdomain

Attributes

subdomains[RW]

Public Class Methods

new(subdomains) click to toggle source
# File lib/ensure_subdomain.rb, line 6
def initialize(subdomains)
  subdomains = [subdomains] unless subdomains.respond_to?(:map)
  self.subdomains = subdomains.map { |s| s.sub(/\.$/, '') }
end

Public Instance Methods

matches?(request) click to toggle source
# File lib/ensure_subdomain.rb, line 11
def matches?(request)
  # Don't deal with addresses like http://0.0.0.0:3000
  request.domain.present? and requires_redirect?(request)
end
to(params, request) click to toggle source

Only called when not on an appropriate domain

# File lib/ensure_subdomain.rb, line 17
def to(params, request)
  url = request.protocol
  url << redirect_to_full_domain(request)
  url << "/#{params[:path]}" if params[:path].present?
  url
end

Private Instance Methods

apex_required?() click to toggle source
# File lib/ensure_subdomain.rb, line 48
def apex_required?
  self.subdomains.size == 1 && self.subdomains.first == ''
end
on_allowed_subdomain?(request) click to toggle source
# File lib/ensure_subdomain.rb, line 42
def on_allowed_subdomain?(request)
  self.subdomains.select do |subdomain|
    request.subdomain == subdomain
  end.size > 0
end
redirect_to_full_domain(request) click to toggle source
# File lib/ensure_subdomain.rb, line 25
def redirect_to_full_domain(request)
  parts = []
  parts << self.subdomains.first if self.subdomains.any?
  parts << request.subdomain if vendor_url?(request)
  parts << request.domain
  parts.reject(&:empty?).join('.')
end
requires_redirect?(request) click to toggle source
# File lib/ensure_subdomain.rb, line 33
def requires_redirect?(request)
  shouldnt_have_a_subdomain?(request) or !on_allowed_subdomain?(request)
end
shouldnt_have_a_subdomain?(request) click to toggle source
# File lib/ensure_subdomain.rb, line 37
def shouldnt_have_a_subdomain?(request)
  # ''.match('www') #=> nil, which is is the opposite of what we want
  apex_required? and request.subdomain.present?
end
vendor_url?(request) click to toggle source
# File lib/ensure_subdomain.rb, line 52
def vendor_url?(request)
  request.domain.match /heroku/
end