Wie kann ich die aktuelle absolute URL in meiner Ruby on Rails-Ansicht abrufen?
Der gibt request.request_uri
nur die relative URL zurück .
Wie kann ich die aktuelle absolute URL in meiner Ruby on Rails-Ansicht abrufen?
Der gibt request.request_uri
nur die relative URL zurück .
Antworten:
Sie sollten verwenden request.original_url
, um die aktuelle URL abzurufen.
Diese Methode ist unter original_url dokumentiert. Wenn Sie jedoch neugierig sind, lautet die Implementierung wie folgt:
def original_url
base_url + original_fullpath
end
Sie können schreiben "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
, da request.url
jetzt veraltet ist.
Sie können schreiben , request.url
statt request.request_uri
. Dadurch wird das Protokoll (normalerweise http: //) mit dem Host und request_uri kombiniert, um Ihnen die vollständige Adresse zu geben.
fullpath
enthält NICHT das Protokoll / die Domäne / den Port! Es ist keine absolute URL!
"http://#{request.host+request.fullpath}"
wird funktionieren oder auf andere Weise (wenn der Port wichtig ist)"http://#{request.host}:#{request.port+request.fullpath}"
"http://#{request.host}:#{request.port}#{request.fullpath}"
request.url
veralteten Anspruch verweisen ? Die vorgeschlagene Lösung ist nur ein langer Weg, um zu sagen, was request.url
bereits getan wird. Die Implementierung ist einfach Protokoll + Host_with_port + Fullpath ( github.com/rails/rails/blob/… )
Du könntest benutzen url_for(only_path: false)
DEPRECATION WARNING: Die Verwendung von #request_uri ist veraltet . Verwenden Sie stattdessen den vollständigen Pfad.
request.uri
und wurde in dieser Frage bereits mehrmals erwähnt, aber ... ok, danke
Wenn Sie Rails 3.2 oder Rails 4 verwenden , sollten request.original_url
Sie die aktuelle URL abrufen.
Die Dokumentation für die Methode finden Sie unter http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url. Wenn Sie jedoch neugierig sind, lautet die Implementierung:
def original_url
base_url + original_fullpath
end
Sie können diese current_url- Methode im ApplicationController hinzufügen , um die aktuelle URL zurückzugeben und das Zusammenführen anderer Parameter zu ermöglichen
# 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
Anwendungsbeispiel:
current_url --> http://...
current_url(:page=>4) --> http://...&page=4
url_for params.merge(:format => "PDF", :only_path => false)
link_to
können Sie nur verwenden , params.merge
die und überspringen url_for
insgesamt
In Ruby on Rails 3.1.0.rc4:
request.fullpath
fullpath
bietet kein absolute URL
als Original angefordertes Poster an.
url_for(params)
Und Sie können ganz einfach neue Parameter hinzufügen:
url_for(params.merge(:tag => "lol"))
Ich denke, request.domain würde funktionieren, aber was ist, wenn Sie sich in einem Unterverzeichnis wie blah.blah.com befinden? So etwas könnte funktionieren:
<%= request.env["HTTP_HOST"] + page = "/" + request.path_parameters['controller'] + "/" + request.path_parameters['action'] %>
Ändern Sie die Parameter basierend auf Ihrer Pfadstruktur.
Ich hoffe, das hilft!
Es sieht so aus, request_uri
als wäre Ruby on Rails 3 veraltet.
Using #request_uri is deprecated. Use fullpath instead.
Verwenden von Ruby 1.9.3-p194 und Ruby on Rails 3.2.6:
Wenn request.fullpath für Sie nicht funktioniert, versuchen Sie request.env ["HTTP_REFERER"]
Hier ist meine Geschichte unten.
Ich habe ein ähnliches Problem beim Erkennen der aktuellen URL (die in der Adressleiste für Benutzer in ihrem Browser angezeigt wird) für kumulative Seiten, die beispielsweise Informationen von verschiedenen Controllern kombinieren http://localhost:3002/users/1/history/issues
.
Der Benutzer kann zu verschiedenen Listen von Problemtypen wechseln. Alle diese Listen werden über Ajax von verschiedenen Controllern / Partials geladen (ohne Neuladen).
Das Problem war , den richtigen Weg für die Zurück - Taste in jedem Element der Liste zu setzen , so dass die Zurück - Taste auf einer eigenen Seite und in der kumulativen Seite korrekt beide funktionieren könnte Geschichte .
Wenn ich request.fullpath verwende , wird der Pfad der letzten JavaScript-Anforderung zurückgegeben, bei der es sich definitiv nicht um die gesuchte URL handelt.
Also habe ich request.env ["HTTP_REFERER"] verwendet, in dem die URL der zuletzt neu geladenen Anfrage gespeichert ist .
Hier ist ein Auszug aus dem Teil, um eine Entscheidung zu treffen
- 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
Dies funktioniert für Ruby on Rails 3.0 und sollte von den meisten Versionen von Ruby on Rails unterstützt werden:
request.env['REQUEST_URI']
Keiner der Vorschläge hier im Thread hat mir leider geholfen, außer dem, bei dem jemand sagte, er habe den Debugger verwendet, um zu finden, wonach er gesucht hat.
Ich habe einige benutzerdefinierte Fehlerseiten anstelle der Standard - 404 erstellt und 500, aber request.url
in endete /404
statt der erwarteten /non-existing-mumbo-jumbo
.
Was ich benutzen musste war
request.original_url
Sie können die Ruby-Methode verwenden:
:root_url
welches den vollständigen Pfad mit der Basis-URL erhält:
localhost:3000/bla
:root_url
, um die absolute URL zu erhalten? Angenommen, ich verwende etwas Ähnliches some_method(:products_brand_url, brand: brand, entity_name: "brand")
und bin some_method
definiert als "def some_method (route, opts = {}) end". Ich möchte nicht, dass meine Route so aussieht - http://localhost:3000/brands/brand_name?&entity_name="brand"
. Ich möchte, dass die Route so aussieht http://localhost:3000/brands/brand_name
. Ich möchte nur, dass das entity_name
ein Teil des opts Hash ist und nicht als Parameter für die absolute URL.
root_url
.
In Rails 3 können Sie verwenden
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
Schienen 4.0
Sie können verwenden request.original_url
, die Ausgabe erfolgt wie im folgenden Beispiel angegeben
get "/articles?page=2"
request.original_url # => "http://www.example.com/articles?page=2"
Für Rails 3.2 oder Rails 4 Rufen Sie einfach auf diese Weise "request.original_url" auf. Referenz: Original URL Method
Für Schienen 3 Da request.url veraltet ist. Durch Verketten können wir den absoluten Pfad ermitteln
"#{request.protocol}#{request.host_with_port}#{request.fullpath}"
Für Schienen 2
request.url
request.env["REQUEST_URI"]
funktioniert in Schienen 2.3.4 getestet und kennt keine anderen Versionen.
Sie können entweder verwenden
request.original_url
oder
"#{request.protocol}#{request.host_with_port}"
um die aktuelle URL zu erhalten.
Sie können verwenden:
request.full_path
oder
request.url
Hoffentlich wird es Ihr Problem lösen.
Prost
Um die absolute URL zu erhalten, bedeutet dies, dass die URL from the root
so angezeigt werden kann
<%= link_to 'Edit', edit_user_url(user) %>
Der Benutzer users_url generiert eine URL, die das Protokoll und den Hostnamen enthält. Der Hilfsprogramm users_path generiert nur den Pfadabschnitt.
users_url: http://localhost/users
users_path: /users