Comment puis-je obtenir l'URL absolue actuelle dans Ruby on Rails?

Réponses:

1443

Pour Rails 3.2 ou Rails 4+

Vous devez utiliser request.original_urlpour obtenir l'URL actuelle.

Cette méthode est documentée à la méthode original_url , mais si vous êtes curieux, l'implémentation est:

def original_url
  base_url + original_fullpath
end

Pour Rails 3:

Vous pouvez écrire "#{request.protocol}#{request.host_with_port}#{request.fullpath}", car il request.urlest désormais obsolète.


Pour Rails 2:

Vous pouvez écrire à la request.urlplace de request.request_uri. Cela combine le protocole (généralement http: //) avec l'hôte et request_uri pour vous donner l'adresse complète.

Manish Shrivastava
la source
31
comme d'autres utilisateurs l'ont souligné: AVERTISSEMENT DE DÉPRÉCIATION: L'utilisation de #request_uri est déconseillée. Utilisez plutôt fullpath
giladbu
9
@giladbu fullpathn'inclut PAS le protocole / domaine / port! Ce n'est pas une URL absolue!
Alan H.
37
"http://#{request.host+request.fullpath}"fonctionnera ou non, (si le port est important)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc
7
si le port est important, celui-ci fonctionne correctement: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir
3
Pouvez-vous indiquer une référence pour la réclamation qui request.urlest obsolète? La solution proposée n'est qu'un long chemin pour dire ce request.urlqui fait déjà; l'implémentation est simplement protocol + host_with_port + fullpath ( github.com/rails/rails/blob/… )
mhartl
134

Je pense que la méthode Ruby on Rails 3.0 est maintenant request.fullpath.

mcr
la source
13
fullpath n'inclut pas le domaine
lulalala
Je suis heureux que cela ait été fourni car je cherchais réellement comment ne pas inclure le domaine.
Jake
121

Vous pourriez utiliser url_for(only_path: false)

grzuy
la source
Dans mon cas (un peu spécial), c'était presque exactement ce que je voulais. Je viens de changer l'option en true et j'ai obtenu l'url de la page actuelle, sans options. Merci :)
Spiralis
@David n'est pas dans la vue, ce n'est pas le cas. Mais il ne devrait pas y être utilisé de toute façon =)
Lyuben Todorov
Dans mon cas, je voulais changer le nom d'hôte mais garder tout le reste. J'ai trouvé que url_for (hôte: 'www.newdomain.com') fonctionnait le mieux pour moi comme solution au problème. IMO, c'est une solution plus robuste car elle est la même sur toutes les versions de rails.
PeppyHeppy
1
FYI Cela ne fonctionnera pas si vous avez plusieurs chemins d'accès pour la même ressource.
thekingoftruth
68

AVERTISSEMENT DE DÉPRÉCIATION : L' utilisation de #request_uri est déconseillée . Utilisez plutôt fullpath.

écolo
la source
4
Voir les notes sur la réponse stackoverflow.com/a/2165727/166279 , fullpath n'inclut pas le domaine.
Nilloc
cette ligne est venue directement du journal au moment de l'écriture lors de l'utilisation request.uriet cela a déjà été souligné plusieurs fois dans cette question, mais ... ok, merci
ecoologic
1
@ManishShrivastava: drôle, malgré tous les efforts "originaux" que j'ai mis pour répondre à des questions plus complexes, ce copier-coller m'a donné le meilleur score, enfin ... mieux que rien
écoologique
52

Vous pouvez ajouter cette méthode current_url dans ApplicationController pour renvoyer l'URL actuelle et autoriser la fusion dans d'autres paramètres

# 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

Exemple d'utilisation:

current_url --> http://...
current_url(:page=>4) --> http://...&page=4
plus grossier
la source
1
Cela ne semble pas être défini dans Rails 3.1.
Alan H.
1
vous pouvez le faire de cette façonurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike
2
aussi si vous êtes dans un, link_tovous pouvez simplement utiliser params.mergeet ignorer le url_fortout
montrealmike
36

Pour Ruby on Rails 3:

request.url
request.host_with_port

J'ai déclenché une session de débogage et interrogé l'objet de demande:

request.public_methods
Duc
la source
32

Dans Ruby on Rails 3.1.0.rc4:

 request.fullpath
Lucas Renan
la source
5
fullpathne fournit pas un absolute URLcomme l'affiche originale demandée.
Olivier Lacan
28

J'avais besoin de l' URL de l'application mais avec le sous-répertoire. J'ai utilisé:

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

Et vous pouvez facilement ajouter un nouveau paramètre:

url_for(params.merge(:tag => "lol"))
Yuri Barbashov
la source
5
C'est beaucoup plus élégant (mais moins granuleux) que la réponse approuvée.
Olivier Lacan
16

Je pense que request.domain fonctionnerait, mais que faire si vous êtes dans un sous-répertoire comme blah.blah.com? Quelque chose comme ça pourrait fonctionner:

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

Modifiez les paramètres en fonction de la structure de votre chemin.

J'espère que cela pourra aider!

James M
la source
8
Oui, la réponse de Jaime est bien meilleure, mais si vous voulez être vraiment inefficace, vous pouvez le faire à ma façon.
James M
14

Il semble que ce request_urisoit obsolète dans Ruby on Rails 3.

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

Utilisation de Ruby 1.9.3-p194 et Ruby on Rails 3.2.6:

Si request.fullpath ne fonctionne pas pour vous, essayez request.env ["HTTP_REFERER"]

Voici mon histoire ci-dessous.

J'ai eu un problème similaire avec la détection de l'URL actuelle (qui est affichée dans la barre d'adresse de l'utilisateur dans son navigateur) pour les pages cumulatives qui combinent des informations provenant de différents contrôleurs, par exemple http://localhost:3002/users/1/history/issues,.

L'utilisateur peut basculer vers différentes listes de types de problèmes. Toutes ces listes sont chargées via Ajax à partir de différents contrôleurs / partiels (sans rechargement).

Le problème était de définir le chemin d'accès correct pour le bouton de retour dans chaque élément de la liste afin que le bouton de retour puisse fonctionner correctement à la fois dans sa propre page et dans l' historique cumulatif des pages. .

Dans le cas où j'utilise request.fullpath , il retourne le chemin de la dernière requête JavaScript qui n'est certainement pas l'URL que je recherche.

J'ai donc utilisé request.env ["HTTP_REFERER"] qui stocke l'URL de la dernière requête rechargée.

Voici un extrait du partiel pour prendre une décision

- 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
la source
Oui, fullpath vous obtient l'url que vous avez demandée, pas l'url dont vous venez , ce dont j'avais également besoin. Merci pour cela!
Spencer Rathbun
2
Fonctionne très bien, juste ce dont j'avais besoin. Cela devrait cependant être dans une question et une réponse distinctes. Un peu difficile à trouver ici. : /
DDDD
12

Cela fonctionne pour Ruby on Rails 3.0 et devrait être pris en charge par la plupart des versions de Ruby on Rails:

request.env['REQUEST_URI']
Tim Santeford
la source
11

Aucune des suggestions ici dans le fil de discussion ne m'a malheureusement aidé, sauf celle où quelqu'un a dit qu'il avait utilisé le débogueur pour trouver ce qu'il cherchait.

J'ai créé des pages d'erreur personnalisées au lieu des 404 et 500 standard, mais j'ai request.urlterminé au /404lieu de ce qui était attendu /non-existing-mumbo-jumbo.

Ce que je devais utiliser était

request.original_url
Frans
la source
9

Si par parent, vous voulez dire juste sans le domaine, alors examinez request.domain.

ghoppe
la source
8
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
msroot
la source
8

Vous pouvez utiliser la méthode ruby:

:root_url

qui obtiendra le chemin complet avec l'URL de base:

localhost:3000/bla
Idan Wender
la source
C'est la seule solution qui fonctionne dans les sérialiseurs utilisant active_model_serializers dans Rails 4.
Kris Khaira
Pouvez-vous s'il vous plaît me dire comment puis-je restreindre les paramètres que je passe à une URL absolue lorsque j'utilise quelque chose comme :root_urlpour obtenir l'URL absolue? Supposons que j'utilise quelque chose comme some_method(:products_brand_url, brand: brand, entity_name: "brand")et some_methodest défini comme `def some_method (route, opts = {}) end` Je ne veux pas que mon itinéraire ressemble à - http://localhost:3000/brands/brand_name?&entity_name="brand". Je veux que l'itinéraire ressemble http://localhost:3000/brands/brand_name. Je veux juste que cela entity_namefasse partie du hachage opts et non en tant que paramètres de l'url absolue.
boddhisattva
Il n'y a certainement pas de méthode Ruby appeléeroot_url .
smileart
6

vous pouvez utiliser n'importe lequel pour les rails 3.2:

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

Je pense que ça marchera partout

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

Rails 4.0

vous pouvez utiliser request.original_url, la sortie sera comme ci-dessous l'exemple

get "/articles?page=2"

request.original_url # => "http://www.example.com/articles?page=2"
Arvind singh
la source
4

Pour Rails 3.2 ou Rails 4 Obtenez simplement de cette manière "request.original_url" Référence: méthode URL d'origine

Pour Rails 3 Comme request.url est obsolète, nous pouvons obtenir un chemin absolu en concaténant

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

Pour Rails 2

request.url
Amit
la source
3

si vous voulez être précis, c'est-à-dire que vous connaissez le chemin dont vous avez besoin:

link_to current_path(@resource, :only_path => false), current_path(@resource)
Victor S
la source
3

Pour les rails 3:

request.fullpath

Pankhuri
la source
3
request.env["REQUEST_URI"]

fonctionne dans les rails 2.3.4 testés et ne connaît pas les autres versions.

Satishakumar Awati
la source
3

Pour obtenir l'URL de demande sans aucun paramètre de requête.

def current_url_without_parameters
  request.base_url + request.path
end
Nerf
la source
3

Vous pouvez soit utiliser

request.original_url 

ou

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

pour obtenir l'URL actuelle.

Robin Garg
la source
1

Vous pouvez utiliser:

request.full_path

ou

request.url

J'espère que cela résoudra votre problème.

À votre santé

Ali Hassan Mirza
la source
1

Vous pouvez définir une variable sur URI.parse(current_url), je ne vois pas encore cette proposition ici et cela fonctionne pour moi.

RaK427
la source
0

Pour obtenir l'URL absolue, ce qui signifie from the rootqu'elle peut être affichée comme ceci

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

L'assistant users_url génère une URL qui inclut le protocole et le nom d'hôte. L'assistant users_path génère uniquement la portion de chemin.

users_url: http://localhost/users
users_path: /users
Ahmad hamza
la source