Wie erhalte ich die aktuelle absolute URL in Ruby on Rails?

Antworten:

1443

Für Rails 3.2 oder Rails 4+

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

Für Schienen 3:

Sie können schreiben "#{request.protocol}#{request.host_with_port}#{request.fullpath}", da request.urljetzt veraltet ist.


Für Schienen 2:

Sie können schreiben , request.urlstatt request.request_uri. Dadurch wird das Protokoll (normalerweise http: //) mit dem Host und request_uri kombiniert, um Ihnen die vollständige Adresse zu geben.

Manish Shrivastava
quelle
31
Wie andere Benutzer angegeben haben: DEPRECATION WARNING: Die Verwendung von #request_uri ist veraltet. Verwenden Sie stattdessen den
vollständigen
9
@giladbu fullpathenthält NICHT das Protokoll / die Domäne / den Port! Es ist keine absolute URL!
Alan H.
37
"http://#{request.host+request.fullpath}"wird funktionieren oder auf andere Weise (wenn der Port wichtig ist)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc
7
Wenn der Hafen wichtig ist, funktioniert dieser richtig: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir
3
Können Sie auf eine Referenz für den request.urlveralteten Anspruch verweisen ? Die vorgeschlagene Lösung ist nur ein langer Weg, um zu sagen, was request.urlbereits getan wird. Die Implementierung ist einfach Protokoll + Host_with_port + Fullpath ( github.com/rails/rails/blob/… )
mhartl
134

Ich denke, dass die Ruby on Rails 3.0-Methode jetzt ist request.fullpath.

mcr
quelle
13
fullpath enthält nicht die Domain
lulalala
Ich bin froh, dass dies bereitgestellt wurde, da ich tatsächlich nach Möglichkeiten gesucht habe, die Domain nicht einzuschließen.
Jake
121

Du könntest benutzen url_for(only_path: false)

grzuy
quelle
In meinem (etwas besonderen) Fall war dies fast genau das, was ich wollte. Ich habe gerade die Option in true geändert und die URL für die aktuelle Seite ohne Optionen erhalten. Danke :)
Spiralis
@ David nicht in der Ansicht nicht. Aber es sollte dort sowieso nicht verwendet werden =)
Lyuben Todorov
In meinem Fall wollte ich den Hostnamen ändern, aber alles andere behalten. Ich fand, dass url_for (Host: 'www.newdomain.com') als Lösung für das Problem am besten für mich funktioniert. IMO ist eine robustere Lösung, da sie für alle Schienenversionen gleich ist.
PeppyHeppy
1
Zu Ihrer Information Dies funktioniert nicht, wenn Sie mehrere Pfade für dieselbe Ressource haben.
thekingoftruth
68

DEPRECATION WARNING: Die Verwendung von #request_uri ist veraltet . Verwenden Sie stattdessen den vollständigen Pfad.

ökoologisch
quelle
4
Siehe Hinweise zur Antwort stackoverflow.com/a/2165727/166279 , fullpath enthält die Domain nicht.
Nilloc
Diese Zeile kam zum Zeitpunkt des Schreibens bei der Verwendung direkt aus dem Protokoll request.uriund wurde in dieser Frage bereits mehrmals erwähnt, aber ... ok, danke
ecoologic
1
@ ManishShrivastava: lustig, trotz all der "ursprünglichen" Bemühungen, die ich unternahm, um komplexere Fragen zu beantworten, gab mir dieses Kopieren und Einfügen die höchste Punktzahl,
na ja
52

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
gröber
quelle
1
Dies scheint in Rails 3.1 nicht definiert zu sein.
Alan H.
1
Sie könnten es so machenurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike
2
wenn Sie auch in einem sind link_tokönnen Sie nur verwenden , params.mergedie und überspringen url_forinsgesamt
montrealmike
36

Für Ruby on Rails 3:

request.url
request.host_with_port

Ich habe eine Debugger-Sitzung gestartet und das Anforderungsobjekt abgefragt:

request.public_methods
Herzog
quelle
32

In Ruby on Rails 3.1.0.rc4:

 request.fullpath
Lucas Renan
quelle
5
fullpathbietet kein absolute URLals Original angefordertes Poster an.
Olivier Lacan
28

Ich brauchte die Anwendungs- URL, aber mit dem Unterverzeichnis. Ich benutzte:

root_url(:only_path => false)
Dorian
quelle
27
 url_for(params)

Und Sie können ganz einfach neue Parameter hinzufügen:

url_for(params.merge(:tag => "lol"))
Juri Barbaschow
quelle
5
Dies ist weitaus eleganter (wenn auch weniger detailliert) als die genehmigte Antwort.
Olivier Lacan
16

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!

James M.
quelle
8
Ja, Jaimes Antwort ist viel besser, aber wenn Sie wirklich ineffizient sein wollen, können Sie es auf meine Weise tun.
James M
14

Es sieht so aus, request_urials wäre Ruby on Rails 3 veraltet.

Using #request_uri is deprecated. Use fullpath instead.
Ken Earley
quelle
13

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
Serge Seletskyy
quelle
Ja, fullpath gibt dir die URL, die du angefordert hast, nicht die URL, von der du gekommen bist , was ich auch brauchte. Danke dafür!
Spencer Rathbun
2
Funktioniert super, genau das, was ich brauchte. Dies sollte jedoch in einer separaten Frage und Antwort erfolgen. Etwas schwer zu finden hier. : /
DDDD
12

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']
Tim Santeford
quelle
11

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.urlin endete /404statt der erwarteten /non-existing-mumbo-jumbo.

Was ich benutzen musste war

request.original_url
Frans
quelle
9

Wenn Sie mit relativ meinen, nur ohne die Domain, dann schauen Sie in request.domain.

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

Sie können die Ruby-Methode verwenden:

:root_url

welches den vollständigen Pfad mit der Basis-URL erhält:

localhost:3000/bla
Idan Wender
quelle
Dies ist die einzige Lösung, die in Serialisierern mit active_model_serializers in Rails 4
funktioniert.
Können Sie mir bitte sagen, wie ich die Parameter, die ich übergebe, auf eine absolute URL beschränken kann, wenn ich etwas verwende :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_methoddefiniert 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_nameein Teil des opts Hash ist und nicht als Parameter für die absolute URL.
Boddhisattva
Sicherlich gibt es keine Ruby- Methode root_url.
Smileart
6

Sie können eine beliebige für Schienen 3.2 verwenden:

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

Ich denke, es wird überall funktionieren

"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
uma
quelle
6

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"
Arvind singh
quelle
4

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
Amit
quelle
3

Wenn Sie spezifisch sein wollen, wissen Sie, welchen Weg Sie brauchen:

link_to current_path(@resource, :only_path => false), current_path(@resource)
Victor S.
quelle
3

Für Schienen 3:

request.fullpath

Pankhuri
quelle
3
request.env["REQUEST_URI"]

funktioniert in Schienen 2.3.4 getestet und kennt keine anderen Versionen.

Satishakumar Awati
quelle
3

Um die Anforderungs-URL ohne Abfrageparameter abzurufen.

def current_url_without_parameters
  request.base_url + request.path
end
Nerv
quelle
3

Sie können entweder verwenden

request.original_url 

oder

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

um die aktuelle URL zu erhalten.

Robin Garg
quelle
1

Sie können verwenden:

request.full_path

oder

request.url

Hoffentlich wird es Ihr Problem lösen.

Prost

Ali Hassan Mirza
quelle
1

Sie können eine Variable auf setzen URI.parse(current_url). Ich sehe diesen Vorschlag hier noch nicht und er funktioniert für mich.

RaK427
quelle
0

Um die absolute URL zu erhalten, bedeutet dies, dass die URL from the rootso 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
Ahmad Hamza
quelle