123456789_123456789_123456789_123456789_123456789_

Module: ActionController::UrlFor

Overview

Includes url_for into the host class. The class has to provide a RouteSet by implementing the _routes method. Otherwise, an exception will be raised.

In addition to ::AbstractController::UrlFor, this module accesses the HTTP layer to define URL options like the host. In order to do so, this module requires the host class to implement env which needs to be Rack-compatible, and request which returns an ::ActionDispatch::Request instance.

class RootUrl
  include ActionController::UrlFor
  include Rails.application.routes.url_helpers

  delegate :env, :request, to: :controller

  def initialize(controller)
    @controller = controller
    @url        = root_path # named route from the application.
  end
end

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

append_features, prepend_features

Instance Attribute Summary

Instance Method Summary

::AbstractController::UrlFor - Included

::ActionDispatch::Routing::UrlFor - Included

#initialize,
#route_for

Allows calling direct or regular named route.

#url_for

Generate a URL based on the options provided, default_url_options, and the routes defined in config/routes.rb.

#url_options

Hook overridden in controller to add request information with default_url_options.

#_routes_context, #_with_routes, #full_url_for

::ActionDispatch::Routing::PolymorphicRoutes - Included

#polymorphic_path

Returns the path component of a URL for the given record.

#polymorphic_url

Constructs a call to a named RESTful route for the given record and returns the resulting URL string.

#polymorphic_mapping, #polymorphic_path_for_action, #polymorphic_url_for_action

Instance Method Details

#initialize

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/url_for.rb', line 32

def initialize(...)
  super
  @_url_options = nil
  @_url_options_with_script_name = nil
end

#url_options

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/url_for.rb', line 38

def url_options
  @_url_options ||= {
    host: request.host,
    port: request.optional_port,
    protocol: request.protocol,
    _recall: request.path_parameters,
    **super,
  }.freeze

  if (same_origin = _routes.equal?(request.routes)) ||
     (script_name = request.engine_script_name(_routes)) ||
     (original_script_name = request.original_script_name)

    if original_script_name
      { **@_url_options, original_script_name: original_script_name }.freeze
    else
      effective_script_name = same_origin ? request.script_name : script_name

      # Memoized per script_name value, compared on every call: the
      # script name only changes around engine dispatch, but a stale
      # hash must never be served if it does.
      cached = @_url_options_with_script_name
      if cached && cached[:script_name] == effective_script_name
        cached
      else
        script_name = effective_script_name.empty? ? "" : effective_script_name.dup
        @_url_options_with_script_name = { **@_url_options, script_name: script_name }.freeze
      end
    end
  else
    @_url_options
  end
end