it-swarm.com.ru

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

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

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

1001
Jakub Arnold

Для 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, чтобы дать вам полный адрес.

1366
Jaime Bellmyer

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

130
mcr

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

114
grzuy

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

67
ecoologic

Если вы используете 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
58
Mike

Вы можете добавить этот метод 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
50
grosser

Для Ruby on Rails 3:

request.url
request.Host_with_port

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

request.public_methods
35
Duke

В Ruby on Rails 3.1.0.rc4:

 request.fullpath
31
Lucas Renan

Мне нужно приложение URL но с подкаталогом. Я использовал:

root_url(:only_path => false)
28
Dorian
 url_for(params)

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

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

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

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

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

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

15
James M

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

Using #request_uri is deprecated. Use fullpath instead.
14
Ken Earley

Используя 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 с разных контроллеров/частичных (без перезагрузки).

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

В случае, если я использую 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
13
Serge Seletskyy

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

request.env['REQUEST_URI']
12
Tim Santeford

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

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

Что мне нужно было использовать

request.original_url
11
Frans

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

9
ghoppe

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

:root_url

который получит полный путь с базовым URL:

localhost:3000/bla
9
Idan Wender
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
8
msroot

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

request.original_url

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

6
mikrobi

Rails 4.0

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

get "/articles?page=2"

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

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

link_to current_path(@resource, :only_path => false), current_path(@resource)
3
Victor S

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

request.original_url 

или же 

"#{request.protocol}#{request.Host_with_port}" 

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

3
Robin Garg

Для Rails 3:

request.fullpath

3
Pankhuri

Для Rails 3.2 или Rails 4 Просто получите таким образом «request.original_url» Ссылка: Оригинальный метод URL

Для Rails 3 Так как request.url устарел. Мы можем получить абсолютный путь путем объединения

"#{request.protocol}#{request.Host_with_port}#{request.fullpath}"

Для Rails 2

request.url
3
Amit

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

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

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

"#{request.protocol}#{request.Host}:#{request.port}#{request.fullpath}"
3
uma
request.env["REQUEST_URI"]

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

2
Satishakumar Awati

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

def current_url_without_parameters
  request.base_url + request.path
end
2
Nerve

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

request.full_path

или же 

request.url

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

Ура

1
Ali Hassan Mirza

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

1
RaK427

Для Rails 3.x и выше:

#{request.protocol}#{request.Host_with_port}#{request.fullpath}

Для Rails 3.2 и выше:

request.original_url

Потому что в Rails 3.2 и выше:

request.original_url = request.base_url + request.original_fullpath

Для получения дополнительной информации, пожалуйста, посетите http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url

0
V K Singh

Rails 4

Контроллер:

def absolute_url
  request.base_url + request.original_fullpath
end

Action Mailer Заметные изменения в выпуск 4.2 :

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

0
user3118220

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

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

Помощник users_url генерирует URL, который включает протокол и имя хоста Помощник users_path генерирует только часть пути.

users_url: http://localhost/users
users_path: /users
0
Ahmad hamza