Як отримати поточну абсолютну URL-адресу в Ruby on Rails?


Відповіді:


1443

Для рейок 3.2 або рейки 4+

Ви повинні використовувати request.original_urlдля отримання поточної URL-адреси.

Цей метод задокументовано методом original_url , але якщо вам цікаво, реалізація така:

def original_url
  base_url + original_fullpath
end

Для рейок 3:

Можна писати "#{request.protocol}#{request.host_with_port}#{request.fullpath}", оскільки request.urlзараз застаріла.


Для рейок 2:

Можна писати request.urlзамість request.request_uri. Це поєднує протокол (зазвичай http: //) з хостом, і request_uri, щоб дати вам повну адресу.


31
як вказували інші користувачі: ПОСТАНОВЛЕННЯ УВАГА: Використання #request_uri застаріло. Використовуйте замість fullpath
giladbu

9
@giladbu fullpathНЕ включає протокол / домен / порт! Це не абсолютна URL-адреса!
Алан Х.

37
"http://#{request.host+request.fullpath}"буде працювати чи інакше, (якщо порт важливий)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc

7
якщо порт важливий, цей працює правильно: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir

3
Чи можете ви вказати на посилання на вимогу, яка request.urlзастаріла? Пропоноване рішення - це лише довгий шлях сказати те, що request.urlвже є; реалізація - просто протокол + host_with_port + fullpath ( github.com/rails/rails/blob/… )
mhartl

134

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


13
fullpath не включає домен
lulalala

Я радий, що це було надано, оскільки я насправді шукав, як не включити домен.
Джейк

121

Ви можете використовувати url_for(only_path: false)


У моєму (трохи особливому випадку) це було майже саме те, що я хотів. Я просто змінив параметр на true та отримав URL-адресу для поточної сторінки без варіантів. Дякую :)
Спіраліс

@David не в перегляді, це не так. Але його все одно не варто використовувати =)
Любен Тодоров

У моєму випадку я хотів змінити ім'я хоста, але зберегти все інше. Я виявив, що url_for (хост: 'www.newdomain.com') працював найкраще для мене як рішення проблеми. IMO - це більш надійне рішення, оскільки воно однакове для всіх версій рейок.
PeppyHeppy

1
FYI Це не спрацює, якщо у вас є кілька шляхів для одного ресурсу.
thekingoftruth

68

ПОПЕРЕДЖЕННЯ ЗАВАНТАЖЕННЯ : Використання #request_uri застаріле . Замість цього використовуйте fullpath.


4
Дивіться примітки на відповідь stackoverflow.com/a/2165727/166279 , FULLPATH не входить в домен.
Nilloc

цей рядок вийшов прямо з журналу під час написання під час використання, request.uriі це вже кілька разів вказувалося в цьому запитанні, але ... добре, дякую
ecoologic

1
@ManishShrivastava: смішно, незважаючи на всі "оригінальні" зусилля, які я поставив, відповідаючи на більш складні запитання, ця копія та вставка дали мені найвищий бал, ну ... краще, ніж нічого
екологічний


52

Ви можете додати цей метод 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.
Алан Х.

1
ви могли зробити це такurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike

2
також якщо ви знаходитесь у link_toвас, ви можете просто використовувати params.mergeта пропустити url_forцілком
montrealmike

36

Для Ruby on Rails 3:

request.url
request.host_with_port

Я запустив сесію налагодження і запитав об’єкт запиту:

request.public_methods



27
 url_for(params)

І ви можете легко додати новий параметр:

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

5
Це набагато елегантніше (якщо менш детально), ніж схвалена відповідь.
Олів'є Лакан

16

Я думаю, що request.domain спрацює, але що робити, якщо ви знаходитесь в підкаталозі, наприклад, blah.blah.com? Щось подібне може спрацювати:

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

Змініть параметри на основі вашої структури шляху.

Сподіваюся, що це допомагає!


8
Так, відповідь Хайме набагато краща, але якщо ти хочеш бути дійсно неефективним, ти можеш зробити це по-моєму.
Джеймс М

14

Схоже, request_uriце застаріле в Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.

13

Використовуючи 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

Так, fullpath отримує вам URL-адресу, про який ви просили, а не URL-адресу, з якого ви прийшли , і це саме те, що мені було потрібно. Дякую за це!
Спенсер Ратбун

2
Чудово працює, просто те, що мені було потрібно. Це має бути в окремому запитанні та відповіді. Свого роду тут важко знайти. : /
DDDD

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

Якщо відносно ви маєте на увазі просто без домену, то подивіться request.domain.



8

Можна використовувати метод рубіну:

:root_url

який отримає повний шлях з базовим URL:

localhost:3000/bla

Це єдине рішення, яке працює в серіалізаторах із використанням active_model_serializer в Rails 4.
Kris Khaira

Скажіть, будь ласка, як я можу обмежити параметри, які я передаю, на абсолютний 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щоб це було частиною хеш-опта, а не як параметр до абсолютної URL-адреси.
boddhisattva

Звичайно, немає методу Rubyroot_url .
смайлик


6

ви можете використовувати будь-яку для рейок 3.2:

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

Я думаю, що це буде працювати де завгодно

"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"

6

Рейки 4.0

ви можете використовувати request.original_url, вихід буде наведено нижче приклад

get "/articles?page=2"

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

4

Для Rails 3.2 або Rails 4 Просто перейдіть таким чином "request.original_url" Довідка: Метод оригінальної URL-адреси

Для Rails 3 Оскільки заявка.url застаріла. Ми можемо отримати абсолютний шлях шляхом об'єднання

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

Для рейок 2

request.url

3

якщо ви хочете бути конкретними, значить, ви знаєте потрібний вам шлях:

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



3

Щоб отримати URL-адресу запиту без будь-яких параметрів запиту.

def current_url_without_parameters
  request.base_url + request.path
end

3

Можна або використовувати

request.original_url 

або

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

щоб отримати поточну URL-адресу.


1

Ви можете використовувати:

request.full_path

або

request.url

Сподіваємось, це вирішить вашу проблему.

Ура


1

Ви можете встановити змінну URI.parse(current_url), я ще не бачу цієї пропозиції тут, і вона працює для мене.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.