Comment obtenir l'URL absolute actuelle dans ma vue Ruby on Rails?
Le request.request_uri
renvoie uniquement l'URL relative.
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
Vous pouvez écrire "#{request.protocol}#{request.Host_with_port}#{request.fullpath}"
, puisque request.url
est maintenant obsolète.
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.
Je pense que la méthode Ruby on Rails 3.0 est maintenant request.fullpath
.
Vous pouvez utiliser url_for(:only_path => false)
DEPRECATION WARNING: L'utilisation de #request_uri est déconseillée . 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, la mise en œuvre 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 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
Dans Ruby on Rails 3.1.0.rc4:
request.fullpath
J'avais besoin de l'application URL mais avec le sous-répertoire. J'ai utilisé:
root_url(:only_path => false)
url_for(params)
Et vous pouvez facilement ajouter un nouveau paramètre:
url_for(params.merge(:tag => "lol"))
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!
Il semble que request_uri
soit obsolète dans Ruby on Rails 3.
Using #request_uri is deprecated. Use fullpath instead.
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
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']
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
Si par parent, vous voulez dire sans le domaine, 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ée ci-dessous exemple
get "/articles?page=2"
request.original_url # => "http://www.example.com/articles?page=2"
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)
Vous pouvez soit utiliser
request.original_url
ou
"#{request.protocol}#{request.Host_with_port}"
pour obtenir l'URL actuelle.
Pour les rails 3:
request.fullpath
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
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}"
request.env["REQUEST_URI"]
fonctionne dans Rails 2.3.4 testé et ne sait pas sur les 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.full_path
ou
request.url
Espérons que cela résoudra votre problème.
À votre 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 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
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
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