跳至內容 跳至搜尋

Action Controller UrlFor

url_for 納入主機類別。該類別必須透過實作 _routes 方法來提供 RouteSet。否則會引發例外狀況。

除了納入 AbstractController::UrlFor 之外,這個模組還會存取 HTTP 層以定義 URL 選項,例如 host。為此,這個模組要求主機類別實作 env,必須與 Rack 相容,以及會回傳 ActionDispatch::Request 實例的 request

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
方法
N
U
納入的模組

類別公開方法

new(...)

# File actionpack/lib/action_controller/metal/url_for.rb, line 32
def initialize(...)
  super
  @_url_options = nil
end

實例公開方法

url_options()

# File actionpack/lib/action_controller/metal/url_for.rb, line 37
def url_options
  @_url_options ||= {
    host: request.host,
    port: request.optional_port,
    protocol: request.protocol,
    _recall: request.path_parameters
  }.merge!(super).freeze

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

    options = @_url_options.dup
    if original_script_name
      options[:original_script_name] = original_script_name
    else
      if same_origin
        options[:script_name] = request.script_name.empty? ? "" : request.script_name.dup
      else
        options[:script_name] = script_name
      end
    end
    options.freeze
  else
    @_url_options
  end
end