How can I get the current absolute URL in my Ruby on Rails view?
The request.request_uri only returns the relative URL.
How can I get the current absolute URL in my Ruby on Rails view?
The request.request_uri only returns the relative URL.
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.
fullpath does NOT include the protocol/domain/port! It’s not an absolute URL!"http://#{request.host+request.fullpath}" will work or otherwise, (if the port is important) "http://#{request.host}:#{request.port+request.fullpath}""http://#{request.host}:#{request.port}#{request.fullpath}"request.url is deprecated? The proposed solution is just a long way of saying what request.url already does; the implementation is simply protocol + host_with_port + fullpath (github.com/rails/rails/blob/…)You could use url_for(only_path: false)
/activities/:id path I got 404?id=:id when doing url_for(only_path: false) from a page handling "not found", request.original_url works fineIf 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).
DEPRECATION WARNING: Using #request_uri is deprecated. Use fullpath instead.
request.uri and this has already been pointed out several times in this question, but... ok, thanksYou 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
url_for params.merge(:format => "PDF", :only_path => false)link_to you can just use params.merge and skip the url_for altogetherIn Ruby on Rails 3.1.0.rc4:
request.fullpath
fullpath does not provide an absolute URL as the original poster requested.I needed the application URL but with the subdirectory. I used:
root_url(:only_path => false)
url_for(params)
And you can easily add some new parameter:
url_for(params.merge(:tag => "lol"))
I think request.domain would work, but what if you're in a sub directory like blah.blah.com? Something like this could work:
<%= request.env["HTTP_HOST"] + page = "/" + request.path_parameters['controller'] + "/" + request.path_parameters['action'] %>
Change the parameters based on your path structure.
Hope that helps!
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
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
You can use the ruby method:
:root_url
which will get the full path with base url:
localhost:3000/bla
:root_url to get the absolute url ? Assume I'm usin somethin like some_method(:products_brand_url, brand: brand, entity_name: "brand") and some_method is defined as ` def some_method(route, opts = {}) end ` I don't want my route to look like - http://localhost:3000/brands/brand_name?&entity_name="brand". I want the route to look like http://localhost:3000/brands/brand_name. I just want the entity_name to be a part of the opts hash and not as a params to the absolute url.root_url.In Rails 3 you can use
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
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
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