Как я могу получить текущий абсолютный URL в моем представлении Ruby on Rails?
request.request_uri
возвращает только относительный URL.
Вы можете использовать request.original_url
для получения текущего URL-адреса.
Этот метод описан в метод original_url, но если вам интересно, реализация такова:
def original_url
base_url + original_fullpath
end
Вы можете написать "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
, так как request.url
теперь устарел.
Вы можете написать request.url
вместо request.request_uri
. Это объединяет протокол (обычно http://) с хостом и request_uri, чтобы предоставить вам полный адрес.
fullpath
НЕ включает протокол / домен / порт! Это не абсолютный URL!
Я думаю, что теперь Ruby on Rails 3.0 теперь request.fullpath
.
Вы можете использовать url_for(:only_path => false)
ПРЕДУПРЕЖДЕНИЕ О ДЕПРЕКАЦИИ: Использование #request_uri устарело. Вместо этого используйте полный путь.
request.uri
и на этот вопрос уже несколько раз указывалось, но ... хорошо, спасибо
Если вы используете 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
Вы можете добавить этот 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
В Ruby on Rails 3.1.0.rc4:
request.fullpath
fullpath
не предоставляет absolute URL
как запрошенный оригинальный постер.
Мне понадобилось приложение 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
Это работает для Ruby on Rails 3.0 и должно поддерживаться большинством версий Ruby on Rails:
request.env['REQUEST_URI']
Ни одно из предложений здесь в теме не помогло мне с грустью, кроме тех, где кто-то сказал, что он использовал отладчик, чтобы найти то, что он искал.
Я создал некоторые пользовательские страницы ошибок вместо стандартных 404 и 500, но request.url
закончился /404
вместо ожидаемого /non-existing-mumbo-jumbo
.
Мне нужно было
request.original_url
Вы можете использовать рубиновый метод:
:root_url
который получит полный путь: локальный: 3000/л
: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.
Если относительный, вы имеете в виду только без домена, а затем посмотрите 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
Rails 4.0
вы можете использовать request.original_url
, вывод будет таким, как показано ниже.
get "/articles?page=2"
request.original_url # => "http://www.example.com/articles?page=2"
Для рельсов 3:
request.fullpath
если вы хотите быть конкретным, то есть знаете, какой путь вам нужен:
link_to current_path(@resource, :only_path => false), current_path(@resource)
Получить URL-адрес запроса без каких-либо параметров запроса.
def current_url_without_parameters
request.base_url + request.path
end
вы можете использовать любой для рельсов 3.2:
request.original_url
or
request.env["HTTP_REFERER"]
or
request.env['REQUEST_URI']
Я думаю, что он будет работать везде, где
"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
request.env["REQUEST_URI"]
работает в rails 2.3.4 и не знает о других версиях.
Вы можете использовать
request.original_url
или
"#{request.protocol}#{request.host_with_port}"
чтобы получить текущий URL.
Вы можете использовать:
request.full_path
или
request.url
Надеюсь, это решит вашу проблему.
Приветствия
Для 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
Вы можете установить переменную в URI.parse(current_url)
, я пока не вижу это предложение, и оно работает для меня.
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
Чтобы получить абсолютный URL, что означает, что from the root
он может отображаться следующим образом
<%= link_to 'Edit', edit_user_url(user) %>
Помощник users_url создает URL-адрес, содержащий протокол и хост имя. Помощник users_path генерирует только часть пути.
users_url: http://localhost/users
users_path: /users
вы можете получить абсолютный URL, вызвав:
request.original_url
или
request.env['HTTP_REFERER']