web-dev-qa-db-fra.com

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

Comment obtenir l'URL absolute actuelle dans ma vue Ruby on Rails?

Le request.request_uri renvoie uniquement l'URL relative.

979
Jakub Arnold

Pour Rails 3.2 ou Rails 4+

Vous devriez utiliser request.original_url pour obtenir l'URL actuelle.

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

def original_url
  base_url + original_fullpath
end

Pour les rails 3:

Vous pouvez écrire "#{request.protocol}#{request.Host_with_port}#{request.fullpath}", puisque request.url est maintenant obsolète.


Pour Rails 2:

Vous pouvez écrire request.url au lieu 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.

1366
Jaime Bellmyer

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

130
mcr

Vous pouvez utiliser url_for(:only_path => false)

114
grzuy

DEPRECATION WARNING: L'utilisation de #request_uri est déconseillée . Utilisez fullpath à la place. 

67
ecoologic

Si vous utilisez Rails 3.2 ou Rails 4, vous devez utiliser request.original_url pour obtenir l'URL actuelle.


La documentation de la méthode est à http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url mais si vous êtes curieux, la mise en œuvre est:

def original_url
  base_url + original_fullpath
end
58
Mike

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
50
grosser

Pour Ruby on Rails 3:

request.url
request.Host_with_port

J'ai lancé une session de débogage et interrogé l'objet de requête:

request.public_methods
35
Duke

Dans Ruby on Rails 3.1.0.rc4:

 request.fullpath
31
Lucas Renan

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

root_url(:only_path => false)
28
Dorian
 url_for(params)

Et vous pouvez facilement ajouter un nouveau paramètre:

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

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

<%= 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!

15
James M

Il semble que request_uri soit obsolète dans Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.
14
Ken Earley

Utilisation de Ruby 1.9.3-p194 et de 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 (affichée dans la barre d'adresse de l'utilisateur dans son navigateur) pour les pages cumulatives combinant 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 consistait à définir le chemin correct pour le bouton Précédent dans chaque élément de la liste afin que le bouton Précédent puisse fonctionner correctement à la fois dans sa propre page et dans la page cumulative historique.

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

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

Voici un extrait de la partie 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
13
Serge Seletskyy

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

Aucune des suggestions ici dans le fil ne m'a pas aidé, sauf celle où quelqu'un a dit qu'il utilisait 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 request.url s'est terminé par /404 au lieu du /non-existing-mumbo-jumbo attendu.

Ce que je devais utiliser était

request.original_url
11
Frans

Si par parent, vous voulez dire sans le domaine, regardez dans request.domain.

9
ghoppe

Vous pouvez utiliser la méthode Ruby:

:root_url

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

localhost:3000/bla
9
Idan Wender
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
8
msroot

Dans Rails 3, vous pouvez utiliser

request.original_url

http://apidock.com/Rails/v3.2.8/ActionDispatch/Request/original_url

6
mikrobi

Rails 4.0

vous pouvez utiliser request.original_url, la sortie sera comme donnée ci-dessous exemple

get "/articles?page=2"

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

si vous voulez être spécifique, cela signifie que vous connaissez le chemin dont vous avez besoin: 

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

Vous pouvez soit utiliser 

request.original_url 

ou 

"#{request.protocol}#{request.Host_with_port}" 

pour obtenir l'URL actuelle.

3
Robin Garg

Pour les rails 3:

request.fullpath

3
Pankhuri

For Rails 3.2 or Rails 4 Entrez simplement "request.original_url" Référence: Méthode URL originale

For Rails 3 As 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
Amit

vous pouvez utiliser n’importe lequel pour Rails 3.2:

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

Je pense que ça va marcher partout

"#{request.protocol}#{request.Host}:#{request.port}#{request.fullpath}"
3
uma
request.env["REQUEST_URI"]

fonctionne dans Rails 2.3.4 testé et ne sait pas sur les autres versions.

2

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

def current_url_without_parameters
  request.base_url + request.path
end
2
Nerve

Vous pouvez utiliser:

request.full_path

ou 

request.url

Espérons que cela résoudra votre problème.

À votre santé

1
Ali Hassan Mirza

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

1
RaK427

Pour Rails 3.x et plus:

#{request.protocol}#{request.Host_with_port}#{request.fullpath}

Pour Rails 3.2 et plus:

request.original_url

Parce que dans Rails 3.2 et plus:

request.original_url = request.base_url + request.original_fullpath

Pour plus d'informations, veuillez visiter http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url

0
V K Singh

Rails 4

Manette:

def absolute_url
  request.base_url + request.original_fullpath
end

Action Mailer Changements notables dans version 4.2 :

link_to et url_for génèrent des URL absolues par défaut dans les modèles, il n'est plus nécessaire de passer only_path: false. (Commettre)

Vue:

Si vous utilisez le suffixe _url, l'URL générée est absolue. Utilisez _path pour obtenir une URL relative.

<%= link_to "Home", root_url %>

Pour plus de détails, allez à:

http://blog.grepruby.com/2015/04/absolute-url-full-url-in-Rails-4.html

0
user3118220

Pour obtenir l'URL absolue, cela signifie que le from the root peut être affiché comme ceci 

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

L'assistant users_url génère une URL comprenant 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
0
Ahmad hamza