Jak uzyskać bieżący bezwzględny adres URL w Ruby on Rails?

Odpowiedzi:

1443

Dla Rails 3.2 lub Rails 4+

Powinieneś użyć, request.original_urlaby uzyskać bieżący adres URL.

Ta metoda jest udokumentowana metodą original_url , ale jeśli jesteś ciekawy, implementacja jest następująca:

def original_url
  base_url + original_fullpath
end

W przypadku szyn 3:

Możesz pisać "#{request.protocol}#{request.host_with_port}#{request.fullpath}", ponieważ request.urljest już przestarzałe.


W przypadku szyn 2:

Możesz pisać request.urlzamiast request.request_uri. Łączy to protokół (zwykle http: //) z hostem i request_uri, aby dać ci pełny adres.

Manish Shrivastava
źródło
31
jak wskazali inni użytkownicy: OSTRZEŻENIE DEPRECACYJNE: Używanie #request_uri jest przestarzałe. Zamiast tego użyj pełnej ścieżki
giladbu,
9
@ giladbu fullpathNIE zawiera protokołu / domeny / portu! To nie jest bezwzględny adres URL!
Alan H.
37
"http://#{request.host+request.fullpath}"będzie działać lub inaczej, (jeśli port jest ważny)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc
7
jeśli port jest ważny, ten działa poprawnie: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir,
3
Czy możesz wskazać odwołanie do roszczenia, które request.urljest nieaktualne? Proponowane rozwiązanie jest tylko długą drogą do powiedzenia, co request.urljuż działa; implementacja jest po prostu protokołem + host_with_port + fullpath ( github.com/rails/rails/blob/… )
mhartl
134

Myślę, że teraz jest metoda Ruby on Rails 3.0 request.fullpath.

mcr
źródło
13
fullpath nie obejmuje domeny
lulalala
Cieszę się, że to podano, ponieważ tak naprawdę szukałem sposobu, aby nie uwzględniać domeny.
Jake
121

Możesz użyć url_for(only_path: false)

grzuy
źródło
W moim (nieco specjalnym przypadku) było to prawie dokładnie to, czego chciałem. Właśnie zmieniłem opcję na true i otrzymałem adres URL bieżącej strony, bez opcji. Dzięki :)
Spiralis
@David nie w widoku nie ma. Ale i tak nie powinno się tam używać =)
Lyuben Todorov
W moim przypadku chciałem zmienić nazwę hosta, ale zachować wszystko inne. Odkryłem, że url_for (host: „www.newdomain.com”) działa najlepiej dla mnie jako rozwiązanie problemu. IMO jest bardziej niezawodnym rozwiązaniem, ponieważ jest takie samo we wszystkich wersjach szyn.
PeppyHeppy
1
FYI To nie zadziała, jeśli masz wiele ścieżek dla tego samego zasobu.
thekingoftruth
68

OSTRZEŻENIE DEPRECATION: Używanie #request_uri jest przestarzałe . Zamiast tego użyj pełnej ścieżki.

ekologiczny
źródło
4
Zobacz uwagi na temat odpowiedzi stackoverflow.com/a/2165727/166279 , pełna ścieżka nie obejmuje domeny.
Nilloc
ta linia pochodzi prosto z dziennika w momencie pisania request.urii jest już wskazywana kilka razy w tym pytaniu, ale ... ok, dzięki
ecoologic
1
@ManishShrivastava: zabawne, pomimo wszystkich „oryginalnych” wysiłków, które wkładałem w odpowiedzi na bardziej złożone pytania, ta kopia i pasta dała mi najwyższy wynik, no cóż ... lepszy niż nic
ekologiczny
52

Możesz dodać tę metodę current_url do ApplicationController, aby zwrócić bieżący adres URL i umożliwić scalenie innych parametrów

# 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

Przykładowe użycie:

current_url --> http://...
current_url(:page=>4) --> http://...&page=4
grosser
źródło
1
Nie wydaje się, aby zostało to zdefiniowane w Rails 3.1.
Alan H.
1
można to zrobić w ten sposóburl_for params.merge(:format => "PDF", :only_path => false)
montrealmike,
2
także jeśli jesteś w link_to, możesz po prostu całkowicie użyć params.mergei pominąćurl_for
montrealmike
36

W przypadku Ruby on Rails 3:

request.url
request.host_with_port

Uruchomiłem sesję debugowania i sprawdziłem obiekt żądania:

request.public_methods
Książę
źródło
32

W Ruby on Rails 3.1.0.rc4:

 request.fullpath
Lucas Renan
źródło
5
fullpathnie zapewnia absolute URLoryginalnego plakatu wymaganego.
Olivier Lacan,
28

Potrzebowałem adresu URL aplikacji, ale z podkatalogiem. Użyłem:

root_url(:only_path => false)
dorycki
źródło
27
 url_for(params)

I możesz łatwo dodać nowy parametr:

url_for(params.merge(:tag => "lol"))
Jurij Barbaszow
źródło
5
Jest to o wiele bardziej eleganckie (jeśli mniej szczegółowe) niż zatwierdzona odpowiedź.
Olivier Lacan
16

Myślę, że request.domain działałoby, ale co, jeśli jesteś w podkatalogu takim jak blah.blah.com? Coś takiego może działać:

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

Zmień parametry w zależności od struktury ścieżki.

Mam nadzieję, że to pomaga!

James M.
źródło
8
Tak, odpowiedź Jaime'a jest o wiele lepsza, ale jeśli chcesz być naprawdę nieefektywny, możesz zrobić to po swojemu.
James M
14

Wygląda na to, że request_urijest przestarzałe w Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.
Ken Earley
źródło
13

Używanie Ruby 1.9.3-p194 i Ruby on Rails 3.2.6:

Jeśli request.fullpath nie działa dla Ciebie, spróbuj request.env [„HTTP_REFERER”]

Oto moja historia poniżej.

Mam podobny problem z wykryciem bieżącego adresu URL (wyświetlanego w pasku adresu dla użytkownika w przeglądarce) dla stron zbiorczych, które łączą informacje z różnych kontrolerów, na przykład: http://localhost:3002/users/1/history/issues .

Użytkownik może przełączać się na różne listy rodzajów problemów. Wszystkie te listy są ładowane przez Ajax z różnych kontrolerów / części (bez przeładowywania).

Problem polegał na ustawieniu prawidłowej ścieżki dla przycisku Wstecz w każdej pozycji listy, aby przycisk Wstecz mógł działać poprawnie zarówno na własnej stronie, jak i w zbiorczej historii stron .

W przypadku korzystania z request.fullpath zwraca ścieżkę ostatniego żądania JavaScript, które zdecydowanie nie jest adresem URL, którego szukam.

Użyłem więc request.env [„HTTP_REFERER”], który przechowuje adres URL ostatniego ponownie załadowanego żądania.

Oto fragment częściowy, aby podjąć decyzję

- 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
Serge Seletskyy
źródło
Tak, fullpath dostaje adres, o który prosiłeś, a nie adres, z którego przyszedłeś , i tego też potrzebowałem. Dzięki za to!
Spencer Rathbun,
2
Działa świetnie, właśnie tego potrzebowałem. To powinno być oddzielne pytanie i odpowiedź. Trochę trudno tu znaleźć. : /
DDDD,
12

Działa to dla Ruby on Rails 3.0 i powinno być obsługiwane przez większość wersji Ruby on Rails:

request.env['REQUEST_URI']
Tim Santeford
źródło
11

Żadna z sugestii w tym wątku nie pomogła mi niestety, z wyjątkiem tej, w której ktoś powiedział, że użył debuggera do znalezienia tego, czego szukał.

Utworzyłem niestandardowe strony błędów zamiast standardowych 404 i 500, ale request.urlskończyłem /404zamiast oczekiwanego /non-existing-mumbo-jumbo.

Potrzebowałem użyć

request.original_url
Frans
źródło
9

Jeśli przez krewnego masz na myśli tylko bez domeny, to spójrz na request.domain.

ghoppe
źródło
8
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
msroot
źródło
8

Możesz użyć metody ruby:

:root_url

który uzyska pełną ścieżkę z podstawowym adresem URL:

localhost:3000/bla
Idan Wender
źródło
To jedyne rozwiązanie, które działa w serializatorach korzystających z active_model_serializers w Rails 4.
Kris Khaira
Czy możesz mi powiedzieć, w jaki sposób mogę ograniczyć parametry, które przekazuję do bezwzględnego adresu URL, gdy używam czegoś takiego jak :root_urluzyskanie bezwzględnego adresu URL? Załóżmy, że używam czegoś podobnego some_method(:products_brand_url, brand: brand, entity_name: "brand")i some_methodjest zdefiniowany jako `def some_method (route, opts = {}) end` Nie chcę, aby moja trasa wyglądała jak - http://localhost:3000/brands/brand_name?&entity_name="brand". Chcę, aby wyglądała trasa http://localhost:3000/brands/brand_name. Chcę tylko, entity_nameaby była częścią skrótu opts, a nie jako parametr bezwzględnego adresu URL.
boddhisattwa
Na pewno nie ma żadnej metody Rubyroot_url .
Smileart
6

możesz użyć dowolnego dla szyn 3.2:

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

Myślę, że będzie działać wszędzie

"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
uma
źródło
6

Szyny 4.0

możesz użyć request.original_url, wynik będzie taki, jak podano poniżej

get "/articles?page=2"

request.original_url # => "http://www.example.com/articles?page=2"
Arvind singh
źródło
4

Dla Railsów 3.2 lub Railsów 4 Po prostu uzyskaj w ten sposób „request.original_url” Odniesienie: Metoda oryginalnego adresu URL

Dla Rails 3 As request.url jest przestarzałe. Możemy uzyskać ścieżkę bezwzględną przez konkatenację

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

Do szyn 2

request.url
Amit
źródło
3

jeśli chcesz być konkretny, to znaczy znasz ścieżkę, której potrzebujesz:

link_to current_path(@resource, :only_path => false), current_path(@resource)
Victor S.
źródło
3

W przypadku szyn 3:

request.fullpath

Pankhuri
źródło
3
request.env["REQUEST_URI"]

działa w szynach 2.3.4 przetestowanych i nie wiem o innych wersjach.

Satishakumar Awati
źródło
3

Aby uzyskać adres URL żądania bez parametrów zapytania.

def current_url_without_parameters
  request.base_url + request.path
end
Nerw
źródło
3

Możesz albo użyć

request.original_url 

lub

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

aby uzyskać bieżący adres URL.

Robin Garg
źródło
1

Możesz użyć:

request.full_path

lub

request.url

Mam nadzieję, że rozwiąże to twój problem.

Twoje zdrowie

Ali Hassan Mirza
źródło
1

Możesz ustawić zmienną na URI.parse(current_url), nie widzę tu jeszcze tej propozycji i działa ona dla mnie.

RaK427
źródło
0

Aby uzyskać bezwzględny adres URL, co oznacza, from the rootże można go wyświetlić w ten sposób

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

Pomocnik users_url generuje adres URL zawierający protokół i nazwę hosta. Pomocnik users_path generuje tylko część ścieżki.

users_url: http://localhost/users
users_path: /users
Ahmad Hamza
źródło