Jakub Arnold
Jakub Arnold

Reputation: 87210

How do I get the current absolute URL in Ruby on Rails?

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

Answers (30)

Mike
Mike

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

Jaime Bellmyer
Jaime Bellmyer

Reputation: 23307

For Rails 3.2 or Rails 4+

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

For Rails 3:

You can write "#{request.protocol}#{request.host_with_port}#{request.fullpath}", since request.url is now deprecated.


For Rails 2:

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

grzuy
grzuy

Reputation: 5021

You could use url_for(only_path: false)

Upvotes: 130

Amit
Amit

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

Idan Wender
Idan Wender

Reputation: 987

You can use the ruby method:

:root_url

which will get the full path with base url:

localhost:3000/bla

Upvotes: 9

V K Singh
V K Singh

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

grosser
grosser

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

RaK427
RaK427

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

Robin Garg
Robin Garg

Reputation: 213

You can either use

request.original_url 

or

"#{request.protocol}#{request.host_with_port}" 

to get the current URL.

Upvotes: 5

Ali Hassan Mirza
Ali Hassan Mirza

Reputation: 582

You can use:

request.full_path

or

request.url

Hopefully it will resolve your problem.

Cheers

Upvotes: 1

user3118220
user3118220

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

Nerve
Nerve

Reputation: 6841

To get the request URL without any query parameters.

def current_url_without_parameters
  request.base_url + request.path
end

Upvotes: 4

Arvind singh
Arvind singh

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

user3355933
user3355933

Reputation:

you can get absolute url by calling:

request.original_url

or

request.env['HTTP_REFERER']

Upvotes: -2

uma
uma

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

Satishakumar Awati
Satishakumar Awati

Reputation: 3798

request.env["REQUEST_URI"]

works in rails 2.3.4 tested and do not know about other versions.

Upvotes: 3

Pankhuri
Pankhuri

Reputation: 978

For rails 3 :

request.fullpath

Upvotes: 3

ecoologic
ecoologic

Reputation: 10420

DEPRECATION WARNING: Using #request_uri is deprecated. Use fullpath instead.

Upvotes: 68

Frans
Frans

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

mikrobi
mikrobi

Reputation: 301

In Rails 3 you can use

request.original_url

http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url

Upvotes: 6

Victor S
Victor S

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

Ahmad hamza
Ahmad hamza

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

Sergiy Seletskyy
Sergiy Seletskyy

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

Tim Santeford
Tim Santeford

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

Yuri  Barbashov
Yuri Barbashov

Reputation: 5437

 url_for(params)

And you can easily add some new parameter:

url_for(params.merge(:tag => "lol"))

Upvotes: 28

Dorian
Dorian

Reputation: 23929

I needed the application URL but with the subdirectory. I used:

root_url(:only_path => false)

Upvotes: 29

Duke
Duke

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

Lucas Renan
Lucas Renan

Reputation: 3917

In Ruby on Rails 3.1.0.rc4:

 request.fullpath

Upvotes: 32

Ken Earley
Ken Earley

Reputation: 769

It looks like request_uri is deprecated in Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.

Upvotes: 14

mcr
mcr

Reputation: 4705

I think that the Ruby on Rails 3.0 method is now request.fullpath.

Upvotes: 142

Related Questions