Module: ActionController::UrlWriter

Defined in:
lib/action_controller/url_rewriter.rb

Overview

Write URLs from arbitrary places in your codebase, such as your mailers.

Example:

 class MyMailer
   include ActionController::UrlWriter
   default_url_options[:host] = 'www.basecamphq.com'

   def (token)
     url_for(:controller => 'signup', action => 'index', :token => token)
   end
end

In addition to providing url_for, named routes are also accessible after including UrlWriter.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

:nodoc:



23
24
25
26
27
# File 'lib/action_controller/url_rewriter.rb', line 23

def self.included(base) #:nodoc:
  ActionController::Routing::Routes.install_helpers(base)
  base.mattr_accessor :default_url_options
  base.default_url_options ||= default_url_options
end

Instance Method Details

#url_for(options) ⇒ Object

Generate a url based on the options provided, default_url_options and the routes defined in routes.rb. The following options are supported:

  • :only_path - If true, the relative url is returned. Defaults to false.

  • :protocol - The protocol to connect to. Defaults to ‘http’.

  • :host - Specifies the host the link should be targetted at. If :only_path is false, this option must be provided either explicitly, or via default_url_options.

  • :port - Optionally specify the port to connect to.

  • :anchor - An anchor name to be appended to the path.

  • :skip_relative_url_root - If true, the url is not constructed using the relative_url_root set in ActionController::AbstractRequest.relative_url_root.

  • :trailing_slash - If true, adds a trailing slash, as in “/archive/2009/”

Any other key (:controller, :action, etc.) given to url_for is forwarded to the Routes module.

Examples:

url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :port=>'8080'    # => 'http://somehost.org:8080/tasks/testing'
url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :anchor => 'ok', :only_path => true    # => '/tasks/testing#ok'
url_for :controller => 'tasks', :action => 'testing', :trailing_slash=>true  # => 'http://somehost.org/tasks/testing/'
url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :number => '33'  # => 'http://somehost.org/tasks/testing?number=33'


52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/action_controller/url_rewriter.rb', line 52

def url_for(options)
  options = self.class.default_url_options.merge(options)

  url = ''

  unless options.delete(:only_path)
    url << (options.delete(:protocol) || 'http')
    url << '://' unless url.match("://")

    raise "Missing host to link to! Please provide :host parameter or set default_url_options[:host]" unless options[:host]

    url << options.delete(:host)
    url << ":#{options.delete(:port)}" if options.key?(:port)
  else
    # Delete the unused options to prevent their appearance in the query string.
    [:protocol, :host, :port, :skip_relative_url_root].each { |k| options.delete(k) }
  end
  trailing_slash = options.delete(:trailing_slash) if options.key?(:trailing_slash)
  url << ActionController::AbstractRequest.relative_url_root.to_s unless options[:skip_relative_url_root]
  anchor = "##{CGI.escape options.delete(:anchor).to_param.to_s}" if options[:anchor]
  generated = Routing::Routes.generate(options, {})
  url << (trailing_slash ? generated.sub(/\?|\z/) { "/" + $& } : generated)
  url << anchor if anchor

  url
end