Comment puis-je obtenir l'URL absolue actuelle dans Ruby on Rails?
Comment puis-je obtenir l'URL absolue actuelle dans ma vue Ruby on Rails?
Le request.request_uri
renvoie uniquement l'URL relative.
30 réponses
Pour Rails 3.2 ou Rails 4 +
, Vous devez utiliser request.original_url
pour obtenir l'URL actuelle.
Cette méthode est documentée à original_url method , 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}"
depuis request.url
est maintenant obsolète.
Pour Rails 2:
, Vous pouvez écrire request.url
au lieu de request.request_uri
. Cette combine le protocole (généralement http://) avec l'hôte, et request_uri pour vous donner le plein adresse.
Je pense que la méthode Ruby on Rails 3.0 est maintenant request.fullpath
.
Avertissement de dépréciation: L'utilisation de # request_uri est obsolète . Utilisez fullpath à la place.
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, l'implémentation est:
def original_url
base_url + original_fullpath
end
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
Pour Ruby sur Rails 3:
request.url
request.host_with_port
J'ai déclenché une session de débogueur et interrogé l'objet de requête:
request.public_methods
url_for(params)
Et vous pouvez facilement ajouter un nouveau paramètre:
url_for(params.merge(:tag => "lol"))
Je pense demande.le domaine fonctionnerait, mais que se passe-t-il 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.
Espérons que cela aide!
Il semble que request_uri
soit obsolète dans Ruby on Rails 3.
Using #request_uri is deprecated. Use fullpath instead.
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']
En utilisant Ruby 1.9.3-p194 et Ruby on Rails 3.2.6:
Si demande.fullpath ne fonctionne pas pour vous, essayez la requête .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 combine des informations provenant de différents contrôleurs, par exemple, http://localhost:3002/users/1/history/issues
.
L'utilisateur peut passer à différentes listes de types de problèmes. Toutes ces listes sont chargé via Ajax À partir de différents contrôleurs / partiels (sans rechargement).
Le problème était de définir le chemin 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 la page cumulative history .
Dans le cas où j'utilise demande.fullpath , il renvoie le chemin de la dernière requête JavaScript qui n'est certainement pas l'URL que je recherche.
J'ai Donc utilisé demande.env ["HTTP_REFERER"] qui stocke 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
Aucune des suggestions ici dans le fil ne m'a aidé malheureusement, 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 normes 404 et 500, mais request.url
s'est terminé par /404
au lieu du /non-existing-mumbo-jumbo
attendu.
Ce que j'avais besoin d'utiliser était
request.original_url
Si par rapport, vous voulez dire juste sans le domaine, alors regardez dans request.domain
.
Vous pouvez utiliser la méthode ruby:
:root_url
Qui obtiendra le chemin complet avec l'url de base:
localhost:3000/bla
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
Dans Rails 3, vous pouvez utiliser
request.original_url
Http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
Rails 4.0
Vous pouvez utiliser request.original_url
, la sortie sera comme donné ci-dessous exemple
get "/articles?page=2"
request.original_url # => "http://www.example.com/articles?page=2"
Si vous voulez être spécifique, c'est-à-dire, vous connaissez le chemin dont vous avez besoin:
link_to current_path(@resource, :only_path => false), current_path(@resource)
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 cela fonctionnera partout
"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
request.env["REQUEST_URI"]
Fonctionne dans rails 2.3.4 testé et ne connaît pas d'autres versions.
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
Vous pouvez utiliser
request.original_url
Ou
"#{request.protocol}#{request.host_with_port}"
Pour obtenir L'URL actuelle.
Pour Rails 3.2 ou Rails 4 Simplement obtenir de cette façon "demande.original_url" Référence: méthode URL originale
Pour Rails 3 En tant que demande.l'url est obsolète.Nous pouvons obtenir un chemin absolu en concaténant
"#{request.protocol}#{request.host_with_port}#{request.fullpath}"
Pour Les Rails 2
request.url
Vous pouvez utiliser:
request.full_path
Ou
request.url
Espérons que cela résoudra votre problème.
Santé
Vous pouvez définir une variable sur URI.parse(current_url)
, Je ne vois pas encore cette proposition ici et cela fonctionne pour moi.
Pour obtenir l'URL absolue ce qui signifie que le from the root
, il peut être affiché comme ceci
<%= link_to 'Edit', edit_user_url(user) %>
L'Assistant users_url génère une URL qui inclut le protocole et l'hôte nom. L'Assistant users_path ne génère que la partie path.
users_url: http://localhost/users
users_path: /users