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.


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.


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)


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.


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

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



27
 url_for(params)

I możesz łatwo dodać nowy parametr:

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

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!


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.

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

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']

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

9

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


8
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)

8

Możesz użyć metody ruby:

:root_url

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

localhost:3000/bla

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}"

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"

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

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)



3

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

def current_url_without_parameters
  request.base_url + request.path
end

3

Możesz albo użyć

request.original_url 

lub

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

aby uzyskać bieżący adres URL.


1

Możesz użyć:

request.full_path

lub

request.url

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

Twoje zdrowie


1

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.