Skip to Content Skip to Search

Instance Public methods

url_for(options = nil)

Returns the URL for the set of options provided. This takes the same options as url_for in Action Controller (see the documentation for ActionDispatch::Routing::UrlFor#url_for). Note that by default :only_path is true so you’ll get the relative "/controller/action" instead of the fully qualified URL like "".


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

  • :only_path - If true, returns the relative URL (omitting the protocol, host name, and port) (true by default unless :host is specified).

  • :trailing_slash - If true, adds a trailing slash, as in "/archive/2005/". Note that this is currently not recommended since it breaks caching.

  • :host - Overrides the default (current) host if provided.

  • :protocol - Overrides the default (current) protocol if provided.

  • :user - Inline HTTP authentication (only plucked out if :password is also present).

  • :password - Inline HTTP authentication (only plucked out if :user is also present).

Relying on named routes

Passing a record (like an Active Record) instead of a hash as the options parameter will trigger the named route for that record. The lookup will happen on the name of the class. So passing a Workshop object will attempt to use the workshop_path route. If you have a nested route, such as admin_workshop_path you’ll have to call that explicitly (it’s impossible for url_for to guess that route).

Implicit Controller Namespacing

Controllers passed in using the :controller option will retain their namespace unless it is an absolute one.


<%= url_for(action: 'index') %>
# => /blogs/

<%= url_for(action: 'find', controller: 'books') %>
# => /books/find

<%= url_for(action: 'login', controller: 'members', only_path: false, protocol: 'https') %>
# =>

<%= url_for(action: 'play', anchor: 'player') %>
# => /messages/play/#player

<%= url_for(action: 'jump', anchor: 'tax&ship') %>
# => /testing/jump/#tax&ship

<%= url_for(Workshop) %>
# => /workshops

<%= url_for( %>
# relies on Workshop answering a persisted? call (and in this case returning false)
# => /workshops

<%= url_for(@workshop) %>
# calls @workshop.to_param which by default returns the id
# => /workshops/5

# to_param can be re-defined in a model to provide different URL names:
# => /workshops/1-workshop-name

<%= url_for("") %>
# =>

<%= url_for(:back) %>
# if request.env["HTTP_REFERER"] is set to ""
# =>

<%= url_for(:back) %>
# if request.env["HTTP_REFERER"] is not set or is blank
# => javascript:history.back()

<%= url_for(action: 'index', controller: 'users') %>
# Assuming an "admin" namespace
# => /admin/users

<%= url_for(action: 'index', controller: '/users') %>
# Specify absolute path with beginning slash
# => /users
# File actionview/lib/action_view/routing_url_for.rb, line 82
def url_for(options = nil)
  case options
  when String
  when nil
    super(only_path: _generate_paths_by_default)
  when Hash
    options = options.symbolize_keys

  when ActionController::Parameters

  when :back
  when Array
    components = options.dup
    options = components.extract_options!

    if options[:only_path]
      polymorphic_path(components, options)
      polymorphic_url(components, options)
    method = _generate_paths_by_default ? :path : :url
    builder = ActionDispatch::Routing::PolymorphicRoutes::HelperMethodBuilder.public_send(method)

    case options
    when Symbol
      builder.handle_string_call(self, options)
    when Class
      builder.handle_class_call(self, options)
      builder.handle_model_call(self, options)