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.


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.


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)


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.


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

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


28

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

root_url(:only_path => false)

27
 url_for(params)

Et vous pouvez facilement ajouter un nouveau paramètre:

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

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!


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.

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

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

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

9

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


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

8

Vous pouvez utiliser la méthode ruby:

:root_url

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

localhost:3000/bla

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

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"

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

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)


3
request.env["REQUEST_URI"]

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


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

3

Vous pouvez soit utiliser

request.original_url 

ou

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

pour obtenir l'URL actuelle.


1

Vous pouvez utiliser:

request.full_path

ou

request.url

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

À votre santé


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.