Як я можу отримати поточну абсолютну URL-адресу у вікні Ruby on Rails?
request.request_uri
Тільки повертає відносний URL .
Як я можу отримати поточну абсолютну 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-адреса!
"http://#{request.host+request.fullpath}"
буде працювати чи інакше, (якщо порт важливий)"http://#{request.host}:#{request.port+request.fullpath}"
"http://#{request.host}:#{request.port}#{request.fullpath}"
request.url
застаріла? Пропоноване рішення - це лише довгий шлях сказати те, що request.url
вже є; реалізація - просто протокол + host_with_port + fullpath ( github.com/rails/rails/blob/… )
Ви можете використовувати url_for(only_path: false)
ПОПЕРЕДЖЕННЯ ЗАВАНТАЖЕННЯ : Використання #request_uri застаріле . Замість цього використовуйте fullpath.
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
url_for params.merge(:format => "PDF", :only_path => false)
link_to
вас, ви можете просто використовувати params.merge
та пропустити url_for
цілком
У 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'] %>
Змініть параметри на основі вашої структури шляху.
Сподіваюся, що це допомагає!
Використовуючи 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
який отримає повний шлях з базовим URL:
localhost:3000/bla
: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
щоб це було частиною хеш-опта, а не як параметр до абсолютної URL-адреси.
root_url
.
У Rails 3 ви можете використовувати
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
Рейки 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 Оскільки заявка.url застаріла. Ми можемо отримати абсолютний шлях шляхом об'єднання
"#{request.protocol}#{request.host_with_port}#{request.fullpath}"
Для рейок 2
request.url
request.env["REQUEST_URI"]
працює в перевірених рейках 2.3.4 і не знає про інші версії.
Можна або використовувати
request.original_url
або
"#{request.protocol}#{request.host_with_port}"
щоб отримати поточну URL-адресу.
Ви можете використовувати:
request.full_path
або
request.url
Сподіваємось, це вирішить вашу проблему.
Ура
Отримати абсолютну URL-адресу, що означає, що from the root
вона може відображатися так
<%= link_to 'Edit', edit_user_url(user) %>
Помічник users_url генерує URL-адресу, що включає протокол та ім'я хоста. Помічник users_path генерує лише частину шляху.
users_url: http://localhost/users
users_path: /users