Jak mogę uzyskać bieżący bezwzględny adres URL w widoku Ruby on Rails?
request.request_uri
Zwraca tylko względny adres URL .
Jak mogę uzyskać bieżący bezwzględny adres URL w widoku Ruby on Rails?
request.request_uri
Zwraca tylko względny adres URL .
Odpowiedzi:
Powinieneś użyć, request.original_url
aby 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
Możesz pisać "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
, ponieważ request.url
jest już przestarzałe.
Możesz pisać request.url
zamiast request.request_uri
. Łączy to protokół (zwykle http: //) z hostem i request_uri, aby dać ci pełny adres.
fullpath
NIE zawiera protokołu / domeny / portu! To nie jest bezwzględny adres URL!
"http://#{request.host+request.fullpath}"
będzie działać lub inaczej, (jeśli port jest ważny)"http://#{request.host}:#{request.port+request.fullpath}"
"http://#{request.host}:#{request.port}#{request.fullpath}"
request.url
jest nieaktualne? Proponowane rozwiązanie jest tylko długą drogą do powiedzenia, co request.url
już działa; implementacja jest po prostu protokołem + host_with_port + fullpath ( github.com/rails/rails/blob/… )
Możesz użyć url_for(only_path: false)
OSTRZEŻENIE DEPRECATION: Używanie #request_uri jest przestarzałe . Zamiast tego użyj pełnej ścieżki.
request.uri
i jest już wskazywana kilka razy w tym pytaniu, ale ... ok, dzięki
Jeśli używasz Railsów 3.2 lub Railsów 4 , powinieneś użyć, request.original_url
aby uzyskać bieżący adres URL.
Dokumentacja tej metody znajduje się na stronie http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url, ale jeśli jesteś ciekawy, implementacja jest następująca:
def original_url
base_url + original_fullpath
end
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
url_for params.merge(:format => "PDF", :only_path => false)
link_to
, możesz po prostu całkowicie użyć params.merge
i pominąćurl_for
W Ruby on Rails 3.1.0.rc4:
request.fullpath
fullpath
nie zapewnia absolute URL
oryginalnego plakatu wymaganego.
Potrzebowałem adresu URL aplikacji, ale z podkatalogiem. Użyłem:
root_url(:only_path => false)
url_for(params)
I możesz łatwo dodać nowy parametr:
url_for(params.merge(:tag => "lol"))
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!
Wygląda na to, że request_uri
jest przestarzałe w Ruby on Rails 3.
Using #request_uri is deprecated. Use fullpath instead.
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
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']
Ż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.url
skończyłem /404
zamiast oczekiwanego /non-existing-mumbo-jumbo
.
Potrzebowałem użyć
request.original_url
Możesz użyć metody ruby:
:root_url
który uzyska pełną ścieżkę z podstawowym adresem URL:
localhost:3000/bla
:root_url
uzyskanie bezwzględnego adresu URL? Załóżmy, że używam czegoś podobnego some_method(:products_brand_url, brand: brand, entity_name: "brand")
i some_method
jest 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_name
aby była częścią skrótu opts, a nie jako parametr bezwzględnego adresu URL.
root_url
.
W Rails 3 możesz użyć
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
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"
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
request.env["REQUEST_URI"]
działa w szynach 2.3.4 przetestowanych i nie wiem o innych wersjach.
Możesz albo użyć
request.original_url
lub
"#{request.protocol}#{request.host_with_port}"
aby uzyskać bieżący adres URL.
Możesz użyć:
request.full_path
lub
request.url
Mam nadzieję, że rozwiąże to twój problem.
Twoje zdrowie
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