Как мне получить текущий абсолютный URL в Ruby on Rails?

845

Как я могу получить текущий абсолютный URL в моем представлении Ruby on Rails?

request.request_uri возвращает только относительный URL.

Теги:
url

32 ответа

1206
Лучший ответ

Для Rails 3.2 или Rails 4 +

Вы можете использовать request.original_url для получения текущего URL-адреса.

Этот метод описан в метод original_url, но если вам интересно, реализация такова:

def original_url
  base_url + original_fullpath
end

Для Rails 3:

Вы можете написать "#{request.protocol}#{request.host_with_port}#{request.fullpath}", так как request.url теперь устарел.


Для Rails 2:

Вы можете написать request.url вместо request.request_uri. Это объединяет протокол (обычно http://) с хостом и request_uri, чтобы предоставить вам полный адрес.

  • 30
    как указывали другие пользователи: ПРЕДУПРЕЖДЕНИЕ ОБ УСТРОЙСТВЕ: Использование #request_uri не рекомендуется. Вместо этого используйте полный путь
  • 9
    Полный путь fullpath НЕ включает протокол / домен / порт! Это не абсолютный URL!
Показать ещё 11 комментариев
129

Я думаю, что теперь Ruby on Rails 3.0 теперь request.fullpath.

  • 12
    полный путь не включает домен
113

Вы можете использовать url_for(:only_path => false)

  • 0
    В моем (немного особом случае) это было почти то, что я хотел. Я просто изменил параметр на true и получил URL для текущей страницы без параметров. Спасибо :)
  • 5
    Просто использование url_for (без параметров) также работает.
Показать ещё 3 комментария
64

ПРЕДУПРЕЖДЕНИЕ О ДЕПРЕКАЦИИ: Использование #request_uri устарело. Вместо этого используйте полный путь.

  • 4
    См. Примечания к ответу stackoverflow.com/a/2165727/166279 , полный путь не включает домен.
  • 0
    эта строка пришла прямо из журнала во время записи при использовании request.uri и на этот вопрос уже несколько раз указывалось, но ... хорошо, спасибо
Показать ещё 2 комментария
57

Если вы используете Rails 3.2 или Rails 4, вы должны использовать request.original_url для получения текущего URL-адреса.


Документация для метода находится в http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url, но если вам интересно, реализация выполняется следующим образом:

def original_url
  base_url + original_fullpath
end
  • 5
    дублированный ответ.
47

Вы можете добавить этот current_url метод в ApplicationController, чтобы вернуть текущий URL-адрес и разрешить слияние других параметров

# 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

Пример использования

current_url --> http://...
current_url(:page=>4) --> http://...&page=4
  • 1
    Похоже, это не определено в Rails 3.1.
  • 0
    Не похоже на работу для Rails 3.2.
Показать ещё 2 комментария
33

Для Ruby on Rails 3:

request.url
request.host_with_port

Я активировал сеанс отладчика и запросил объект запроса:

request.public_methods
30

В Ruby on Rails 3.1.0.rc4:

 request.fullpath
  • 5
    fullpath не предоставляет absolute URL как запрошенный оригинальный постер.
28

Мне понадобилось приложение URL, но с поддиректорией. Я использовал:

root_url(:only_path => false)
25
 url_for(params)

И вы можете легко добавить новый параметр:

url_for(params.merge(:tag => "lol"))
  • 5
    Это гораздо более элегантно (хотя и менее детально), чем утвержденный ответ.
14

Я думаю, что request.domain будет работать, но что, если вы находитесь в подкаталоге, таком как blah.blah.com? Что-то вроде этого может работать:

<%= request.env["HTTP_HOST"] + page = "/" + request.path_parameters['controller'] + "/" + request.path_parameters['action'] %>

Измените параметры на основе структуры вашего пути.

Надеюсь, что это поможет!

  • 8
    Да, ответ Хайме намного лучше, но если вы хотите быть действительно неэффективным, вы можете сделать это по-моему.
13

Похоже, что request_uri устарел в Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.
12

Использование Ruby 1.9.3-p194 и Ruby on Rails 3.2.6:

Если request.fullpath не работает для вас, попробуйте request.env [ "HTTP_REFERER" ]

Вот мой рассказ ниже.

У меня возникла аналогичная проблема с обнаружением текущего URL-адреса (который отображается в адресной строке для пользователя в ее браузере) для кумулятивных страниц, которые объединяют информацию от разных контроллеров, например http://localhost:3002/users/1/history/issues.

Пользователь может переключиться на разные списки типов проблем. Все эти списки загружаются через Ajax из разных контроллеров/частичных (без перезагрузки).

Проблема заключалась в том, чтобы установить правильный путь для кнопки "Назад" в каждом элементе списка, чтобы кнопка "Назад" могла корректно работать как на собственной странице, так и в общей истории страниц.

Если я использую request.fullpath, он возвращает путь к последнему запросу JavaScript, который определенно не является URL-адресом, который я ищу.

Поэтому я использовал request.env [ "HTTP_REFERER" ], в котором хранится URL-адрес последнего перезагруженного запроса.

Здесь выдержка из частичного, чтобы принять решение

- 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
  • 0
    Да, fullpath возвращает вам запрошенный URL-адрес, а не URL-адрес, с которого вы пришли , и это тоже то, что мне было нужно. Спасибо за это!
  • 0
    не за что: ^)
Показать ещё 1 комментарий
12

Это работает для Ruby on Rails 3.0 и должно поддерживаться большинством версий Ruby on Rails:

request.env['REQUEST_URI']
11

Ни одно из предложений здесь в теме не помогло мне с грустью, кроме тех, где кто-то сказал, что он использовал отладчик, чтобы найти то, что он искал.

Я создал некоторые пользовательские страницы ошибок вместо стандартных 404 и 500, но request.url закончился /404 вместо ожидаемого /non-existing-mumbo-jumbo.

Мне нужно было

request.original_url
9

Вы можете использовать рубиновый метод:

:root_url

который получит полный путь: локальный: 3000/л

  • 0
    Это единственное решение, которое работает в сериализаторах, использующих active_model_serializer в Rails 4.
  • 0
    Подскажите, пожалуйста, как я могу ограничить передаваемые параметры абсолютным URL, когда я использую что-то вроде :root_url чтобы получить абсолютный URL? Предположим, что я использую что-то вроде some_method(:products_brand_url, brand: brand, entity_name: "brand") а some_method определяется как `def some_method (route, opts = {}) end` Я не хочу, чтобы мой маршрут выглядел как - http://localhost:3000/brands/brand_name?&entity_name="brand" . Я хочу, чтобы маршрут выглядел как http://localhost:3000/brands/brand_name . Я просто хочу, чтобы entity_name являлось частью хэша opts, а не в качестве параметра абсолютного URL.
9

Если относительный, вы имеете в виду только без домена, а затем посмотрите request.domain.

7
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
6

В Rails 3 вы можете использовать

request.original_url

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

  • 0
    Лучший ответ для меня!
4

Rails 4.0

вы можете использовать request.original_url, вывод будет таким, как показано ниже.

get "/articles?page=2"

request.original_url # => "http://www.example.com/articles?page=2"
3

Для рельсов 3:

request.fullpath

3

если вы хотите быть конкретным, то есть знаете, какой путь вам нужен:

link_to current_path(@resource, :only_path => false), current_path(@resource)
2

Получить URL-адрес запроса без каких-либо параметров запроса.

def current_url_without_parameters
  request.base_url + request.path
end
2

вы можете использовать любой для рельсов 3.2:

request.original_url
or
request.env["HTTP_REFERER"]
or
request.env['REQUEST_URI']

Я думаю, что он будет работать везде, где

"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
2
request.env["REQUEST_URI"]

работает в rails 2.3.4 и не знает о других версиях.

  • 1
    работает также в Rails 3.2.14
1

Вы можете использовать

request.original_url 

или

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

чтобы получить текущий URL.

1

Вы можете использовать:

request.full_path

или

request.url

Надеюсь, это решит вашу проблему.

Приветствия

0

Для Rails 3.2 или Rails 4 Просто сделайте так: request.original_url Ссылка: http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url

Для Rails 3 Поскольку request.url устарел. Мы можем получить абсолютный путь путем конкатенации "# {Request.protocol} # {request.host_with_port} # {request.fullpath}"

Для Rails 2 request.url

0

Вы можете установить переменную в URI.parse(current_url), я пока не вижу это предложение, и оно работает для меня.

0

Rails 4

Контроллер:

def absolute_url
  request.base_url + request.original_fullpath
end

Action Mailer Заметные изменения 4.2 release:

link_to и url_for генерировать абсолютные URL по умолчанию в шаблонах, больше не нужно передавать only_path: false. (Commit)

Вид:

Если вы используете суффикс _url, сгенерированный URL-адрес является абсолютным. Используйте _path, чтобы получить относительный URL.

<%= link_to "Home", root_url %>

Для получения дополнительной информации перейдите по ссылке:

http://blog.grepruby.com/2015/04/absolute-url-full-url-in-rails-4.html

  • 1
    Пользовательский метод не требуется. Правильный ответ выше.
0

Чтобы получить абсолютный URL, что означает, что from the root он может отображаться следующим образом

<%= link_to 'Edit', edit_user_url(user) %>

Помощник users_url создает URL-адрес, содержащий протокол и хост имя. Помощник users_path генерирует только часть пути.

users_url: http://localhost/users
users_path: /users
-2

вы можете получить абсолютный URL, вызвав:

request.original_url

или

request.env['HTTP_REFERER']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню