Reputation: 87210
How can I get the current absolute URL in my Ruby on Rails view?
The request.request_uri
only returns the relative URL.
Upvotes: 1131
Views: 577818
Reputation: 9842
If you're using Rails 3.2 or Rails 4, you should use request.original_url
to get the current URL.
Documentation for the method is at http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url, but if you're curious, the implementation is:
def original_url
base_url + original_fullpath
end
EDIT: This is still the case for Rails 7 (Docs).
Upvotes: 68
Reputation: 23307
You should use request.original_url
to get the current URL. Source code on current repo found here.
This method is documented at original_url method, but if you're curious, the implementation is:
def original_url
base_url + original_fullpath
end
You can write "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
, since request.url
is now deprecated.
You can write request.url
instead of request.request_uri
. This combines the protocol (usually http://) with the host, and request_uri to give you the full address.
Upvotes: 1510
Reputation: 174
For Rails 3.2 or Rails 4 Simply get in this way "request.original_url" Reference: Original URL Method
For Rails 3 As request.url is deprecated.We can get absolute path by concatenating
"#{request.protocol}#{request.host_with_port}#{request.fullpath}"
For Rails 2
request.url
Upvotes: 5
Reputation: 987
You can use the ruby method:
:root_url
which will get the full path with base url:
localhost:3000/bla
Upvotes: 9
Reputation: 1254
For Rails 3.x and up:
#{request.protocol}#{request.host_with_port}#{request.fullpath}
For Rails 3.2 and up:
request.original_url
Because in rails 3.2 and up:
request.original_url = request.base_url + request.original_fullpath
For more info, plese visit http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url
Upvotes: 1
Reputation: 15097
You can add this current_url method in the ApplicationController to return the current URL and allow merging in other parameters
# https://x.com/y/1?page=1
# + current_url( :page => 3 )
# = https://x.com/y/1?page=3
def current_url(overwrite={})
url_for :only_path => false, :params => params.merge(overwrite)
end
Example Usage:
current_url --> http://...
current_url(:page=>4) --> http://...&page=4
Upvotes: 52
Reputation: 31
You can set a variable to URI.parse(current_url)
, I don't see this proposal here yet and it works for me.
Upvotes: 3
Reputation: 213
You can either use
request.original_url
or
"#{request.protocol}#{request.host_with_port}"
to get the current URL.
Upvotes: 5
Reputation: 582
You can use:
request.full_path
or
request.url
Hopefully it will resolve your problem.
Cheers
Upvotes: 1
Reputation: 1468
Rails 4
Controller:
def absolute_url
request.base_url + request.original_fullpath
end
Action Mailer Notable changes in 4.2 release:
link_to and url_for generate absolute URLs by default in templates, it is no longer needed to pass only_path: false. (Commit)
View:
If you use the _url
suffix, the generated URL is absolute. Use _path
to get a relative URL.
<%= link_to "Home", root_url %>
For More Details, go to:
http://blog.grepruby.com/2015/04/absolute-url-full-url-in-rails-4.html
Upvotes: 0
Reputation: 6841
To get the request URL without any query parameters.
def current_url_without_parameters
request.base_url + request.path
end
Upvotes: 4
Reputation: 1392
Rails 4.0
you can use request.original_url
, output will be as given below example
get "/articles?page=2"
request.original_url # => "http://www.example.com/articles?page=2"
Upvotes: 6
Reputation:
you can get absolute url by calling:
request.original_url
or
request.env['HTTP_REFERER']
Upvotes: -2
Reputation: 2952
you can use any one for rails 3.2:
request.original_url
or
request.env["HTTP_REFERER"]
or
request.env['REQUEST_URI']
I think it will work every where
"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
Upvotes: 6
Reputation: 3798
request.env["REQUEST_URI"]
works in rails 2.3.4 tested and do not know about other versions.
Upvotes: 3
Reputation: 10420
DEPRECATION WARNING: Using #request_uri is deprecated. Use fullpath instead.
Upvotes: 68
Reputation: 1448
None of the suggestions here in the thread helped me sadly, except the one where someone said he used the debugger to find what he looked for.
I've created some custom error pages instead of the standard 404 and 500, but request.url
ended in /404
instead of the expected /non-existing-mumbo-jumbo
.
What I needed to use was
request.original_url
Upvotes: 12
Reputation: 301
In Rails 3 you can use
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
Upvotes: 6
Reputation: 5132
if you want to be specific, meaning, you know the path you need:
link_to current_path(@resource, :only_path => false), current_path(@resource)
Upvotes: 3
Reputation: 1936
To get the absolute URL which means that the from the root
it can be displayed like this
<%= link_to 'Edit', edit_user_url(user) %>
The users_url helper generates a URL that includes the protocol and host name. The users_path helper generates only the path portion.
users_url: http://localhost/users
users_path: /users
Upvotes: 0
Reputation: 17110
Using Ruby 1.9.3-p194 and Ruby on Rails 3.2.6:
If request.fullpath doesn't work for you, try request.env["HTTP_REFERER"]
Here's my story below.
I got similar problem with detecting current URL (which is shown in address bar for user in her browser) for cumulative pages which combines information from different controllers, for example, http://localhost:3002/users/1/history/issues
.
The user can switch to different lists of types of issues. All those lists are loaded via Ajax from different controllers/partials (without reloading).
The problem was to set the correct path for the back button in each item of the list so the back button could work correctly both in its own page and in the cumulative page history.
In case I use request.fullpath, it returns the path of last JavaScript request which is definitely not the URL I'm looking for.
So I used request.env["HTTP_REFERER"] which stores the URL of the last reloaded request.
Here's an excerpt from the partial to make a decision
- if request.env["HTTP_REFERER"].to_s.scan("history").length > 0
- back_url = user_history_issue_path(@user, list: "needed_type")
- else
- back_url = user_needed_type_issue_path(@user)
- remote ||= false
=link_to t("static.back"), back_url, :remote => remote
Upvotes: 13
Reputation: 28111
This works for Ruby on Rails 3.0 and should be supported by most versions of Ruby on Rails:
request.env['REQUEST_URI']
Upvotes: 12
Reputation: 5437
url_for(params)
And you can easily add some new parameter:
url_for(params.merge(:tag => "lol"))
Upvotes: 28
Reputation: 23929
I needed the application URL but with the subdirectory. I used:
root_url(:only_path => false)
Upvotes: 29
Reputation: 7444
For Ruby on Rails 3:
request.url
request.host_with_port
I fired up a debugger session and queried the request object:
request.public_methods
Upvotes: 39
Reputation: 769
It looks like request_uri
is deprecated in Ruby on Rails 3.
Using #request_uri is deprecated. Use fullpath instead.
Upvotes: 14