Class: Web::UrlBuilder
- Inherits:
-
Object
- Object
- Web::UrlBuilder
- Defined in:
- app/services/web/url_builder.rb
Instance Method Summary collapse
- #default_host ⇒ Object
- #default_locale ⇒ Object
- #default_port ⇒ Object
- #default_scheme ⇒ Object
-
#initialize(options = nil) ⇒ UrlBuilder
constructor
A new instance of UrlBuilder.
- #process(url, force_locale = nil, parameters: {}, anchor: nil, host: nil, scheme: nil, port: nil, strip_params: false, relative: false) ⇒ Object
Constructor Details
#initialize(options = nil) ⇒ UrlBuilder
Returns a new instance of UrlBuilder.
3 4 5 |
# File 'app/services/web/url_builder.rb', line 3 def initialize(=nil) @options = || {} end |
Instance Method Details
#default_host ⇒ Object
7 8 9 |
# File 'app/services/web/url_builder.rb', line 7 def default_host @options[:default_host] end |
#default_locale ⇒ Object
15 16 17 |
# File 'app/services/web/url_builder.rb', line 15 def default_locale @options[:default_locale] end |
#default_port ⇒ Object
19 20 21 |
# File 'app/services/web/url_builder.rb', line 19 def default_port @options[:default_port] end |
#default_scheme ⇒ Object
11 12 13 |
# File 'app/services/web/url_builder.rb', line 11 def default_scheme @options[:default_scheme] end |
#process(url, force_locale = nil, parameters: {}, anchor: nil, host: nil, scheme: nil, port: nil, strip_params: false, relative: false) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'app/services/web/url_builder.rb', line 23 def process(url, force_locale = nil, parameters: {}, anchor: nil, host: nil, scheme: nil, port: nil, strip_params: false, relative: false) return nil unless url.present? port = port.to_s.scan(/\d/).join.to_i if port.present? port ||= default_port # Establish the possible locales valid_locales = I18n.available_locales.map(&:to_s) - [:en, :es] # Validate the force_locale specified force_locale ||= default_locale if force_locale.present? and !valid_locales.include? force_locale.to_s and force_locale != :delocalized raise "cms_link force_locale specifies an invalid locale #{force_locale}, must be one of #{valid_locales.join(',')} or :delocalized" end # Store path uri = Addressable::URI.parse(url.to_s.squish) if relative uri.host = nil uri.scheme = nil uri.port = nil else uri.host = host if host.present? uri.host ||= default_host uri.scheme = scheme if scheme.present? uri.scheme ||= default_scheme uri.scheme ||= 'https' if uri.host.present? uri.port = port.to_i if port.present? && port.to_i.positive? && !port.to_i.in?([443, 80]) end #Rails.logger.debug "[cms_link] #{url} parsed as #{uri.inspect}" #Analyze path, first cleanup path_parts = uri.path.split('/').map(&:presence).compact # Remove the locale path_parts.reject! { |pp| valid_locales.include? pp } # (Re)inject the locale unless we don't want it unless force_locale == :delocalized path_parts.insert(0, (force_locale || I18n.locale).to_s) end # Rebuild our path uri.path = ("/" + path_parts.compact.join('/')).chomp('/').presence #Merge inbound params with passed params merged_params = Rack::Utils.parse_nested_query uri.query merged_params = (merged_params || {}).with_indifferent_access merged_params.merge!(parameters) if parameters # Sometime we don't want the param, in case of canonical for instance if strip_params && parameters.blank? #If we specified parameters we ignore this directive # The only one we preserve is page, if we want more later we can add another parameter to this function merged_params.slice!(:page) end uri.query = merged_params.present? ? merged_params.to_query : nil uri.fragment = anchor if anchor.present? uri.to_s end |