Как мне получить текущий абсолютный URL в Ruby on Rails?
Как я могу получить текущий абсолютный URL в моем представлении Ruby on Rails?
request.request_uri
возвращает только относительный URL.
33 ответа
Для 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, чтобы дать вам полный адрес.
Я думаю, что метод Ruby on Rails 3.0 сейчас request.fullpath
,
ПРЕДУПРЕЖДЕНИЕ ОБ УСТАРЕВАНИИ: Использование #request_uri устарело. Вместо этого используйте полный путь.
Если вы используете Rails 3.2 или Rails 4, вы должны использовать request.original_url
чтобы получить текущий URL.
Документация по этому методу находится по адресу http://api.rubyonrails.org/classes/ActionDispatch/Request.html, но если вам интересно, реализация:
def original_url
base_url + original_fullpath
end
Вы можете добавить этот метод 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
Для Ruby on Rails 3:
request.url
request.host_with_port
Я запустил сеанс отладчика и запросил объект запроса:
request.public_methods
Мне нужен был URL приложения, но с подкаталогом. Я использовал:
root_url(:only_path => false)
url_for(params)
И вы можете легко добавить новый параметр:
url_for(params.merge(:tag => "lol"))
Я думаю, что request.domain будет работать, но что если вы находитесь в подкаталоге, например, blah.blah.com? Нечто подобное может сработать:
<%= request.env["HTTP_HOST"] + page = "/" + request.path_parameters['controller'] + "/" + request.path_parameters['action'] %>
Измените параметры в зависимости от вашей структуры пути.
Надеюсь, это поможет!
Это выглядит как request_uri
устарела в Ruby on Rails 3.
Using #request_uri is deprecated. Use fullpath instead.
Используя 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
К сожалению, ни одно из предложений в этой ветке мне не помогло, кроме одного, где кто-то сказал, что он использовал отладчик, чтобы найти то, что он искал.
Я создал несколько пользовательских страниц ошибок вместо стандартных 404 и 500, но request.url
закончилось в /404
вместо ожидаемого /non-existing-mumbo-jumbo
,
Что мне нужно было использовать
request.original_url
Это работает для Ruby on Rails 3.0 и должно поддерживаться большинством версий Ruby on Rails:
request.env['REQUEST_URI']
Вы можете использовать метод ruby:
:root_url
который получит полный путь с базовым URL:
localhost:3000/bla
Если под относительным вы подразумеваете просто без домена, то посмотрите в request.domain
,
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
В Rails 3 вы можете использовать
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
Вы можете использовать любой для рельсов 3.2:
request.original_url
or
request.env["HTTP_REFERER"]
or
request.env['REQUEST_URI']
Я думаю, что это будет работать везде
"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
Rails 4.0
ты можешь использовать request.original_url
, вывод будет таким, как приведенный ниже пример
get "/articles?page=2"
request.original_url # => "http://www.example.com/articles?page=2"
Для Rails 3.2 или Rails 4 Просто получите таким образом "request.original_url" Ссылка: Оригинальный метод URL
Для Rails 3 Поскольку request.url устарел. Мы можем получить абсолютный путь путем объединения
"#{request.protocol}#{request.host_with_port}#{request.fullpath}"
Для рельсов 2
request.url
Вы можете использовать
request.original_url
или же
"#{request.protocol}#{request.host_with_port}"
чтобы получить текущий URL.
Если вы хотите быть конкретным, то есть знаете, какой путь вам нужен:
link_to current_path(@resource, :only_path => false), current_path(@resource)
Вы можете установить переменную в URI.parse(current_url)
Я не вижу здесь этого предложения, и оно работает для меня.
Получить URL запроса без каких-либо параметров запроса.
def current_url_without_parameters
request.base_url + request.path
end
request.env["REQUEST_URI"]
работает в рельсах 2.3.4 проверено и не знает о других версиях.
Для Rails 3.x и выше:
#{request.protocol}#{request.host_with_port}#{request.fullpath}
Для Rails 3.2 и выше:
request.original_url
Потому что в рельсах 3.2 и выше:
request.original_url = request.base_url + request.original_fullpath
Для получения дополнительной информации, пожалуйста, посетите http://api.rubyonrails.org/classes/ActionDispatch/Request.html
Ты можешь использовать:
request.full_path
или же
request.url
Надеюсь, это решит вашу проблему.
ура