url_for
url_for(options = {})
public
Returns the URL for the set of options provided. This takes the same options as url_for in Action Controller (see the documentation for ActionController::Base#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 “http://example.com/controller/action”.
Options
-
: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 or Active Resource) 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).
Examples
<%= url_for(:action => 'index') %> # => /blog/ <%= url_for(:action => 'find', :controller => 'books') %> # => /books/find <%= url_for(:action => 'login', :controller => 'members', :only_path => false, :protocol => 'https') %> # => https://www.example.com/members/login/ <%= url_for(:action => 'play', :anchor => 'player') %> # => /messages/play/#player <%= url_for(:action => 'jump', :anchor => 'tax&ship') %> # => /testing/jump/#tax&ship <%= url_for(Workshop.new) %> # 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("http://www.example.com") %> # => http://www.example.com <%= url_for(:back) %> # if request.env["HTTP_REFERER"] is set to "http://www.example.com" # => http://www.example.com <%= url_for(:back) %> # if request.env["HTTP_REFERER"] is not set or is blank # => javascript:history.back()
Use the current URL, with changes
You can use the current URL, whatever it is, with changes, as in:
# Create a link to the current page in RSS form url_for(:overwrite_params => {:format => :rss})
This can be super-helpful because it preserves any GET params (like search parameters)
Using namespaces
If you are using a namespace in your routes.rb, for example:
namespace :admin do resources :products end
then you can:
url_for([:admin, @product])
and:
url_for([:edit, :admin, @product])
Specify :host option in emails
Emails need a fully qualified URL (with domain). Use the :host parameter.
But note also that you need to specify a value that is not dependent upon the request context. http://api.rubyonrails.org/classes/ActionMailer/Base.html recommends setting a default host in application.rb For those of us who have development, test, staging and production environments, set in the environment-specific files, or in the :default hash in the mailer.
This applies to both +url_for(:host => “example.com”)+ and when using named routes as in +widgets_url(:host => “example.com”)+