Comment puis-je obtenir l' URL absolue actuelle dans ma vue Ruby on Rails?
La request.request_uri
seule renvoie l' URL relative .
Comment puis-je obtenir l' URL absolue actuelle dans ma vue Ruby on Rails?
La request.request_uri
seule renvoie l' URL relative .
Réponses:
Vous devez utiliser request.original_url
pour 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
Vous pouvez écrire "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
, car il request.url
est désormais obsolète.
Vous pouvez écrire à la request.url
place 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.
fullpath
n'inclut PAS le protocole / domaine / port! Ce n'est pas une URL absolue!
"http://#{request.host+request.fullpath}"
fonctionnera ou non, (si le port est important)"http://#{request.host}:#{request.port+request.fullpath}"
"http://#{request.host}:#{request.port}#{request.fullpath}"
request.url
est obsolète? La solution proposée n'est qu'un long chemin pour dire ce request.url
qui fait déjà; l'implémentation est simplement protocol + host_with_port + fullpath ( github.com/rails/rails/blob/… )
Vous pourriez utiliser url_for(only_path: false)
AVERTISSEMENT DE DÉPRÉCIATION : L' utilisation de #request_uri est déconseillée . Utilisez plutôt fullpath.
request.uri
et cela a déjà été souligné plusieurs fois dans cette question, mais ... ok, merci
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 se trouve à 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
url_for params.merge(:format => "PDF", :only_path => false)
link_to
vous pouvez simplement utiliser params.merge
et ignorer le url_for
tout
Dans Ruby on Rails 3.1.0.rc4:
request.fullpath
fullpath
ne fournit pas un absolute URL
comme l'affiche originale demandée.
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 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!
Il semble que ce 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 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
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 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.url
terminé au /404
lieu de ce qui était attendu /non-existing-mumbo-jumbo
.
Ce que je devais utiliser était
request.original_url
Vous pouvez utiliser la méthode ruby:
:root_url
qui obtiendra le chemin complet avec l'URL de base:
localhost:3000/bla
:root_url
pour obtenir l'URL absolue? Supposons que j'utilise quelque chose comme some_method(:products_brand_url, brand: brand, entity_name: "brand")
et some_method
est 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_name
fasse partie du hachage opts et non en tant que paramètres de l'url absolue.
root_url
.
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 ci-dessous l'exemple
get "/articles?page=2"
request.original_url # => "http://www.example.com/articles?page=2"
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
request.env["REQUEST_URI"]
fonctionne dans les rails 2.3.4 testés et ne connaît pas les autres versions.
Vous pouvez soit utiliser
request.original_url
ou
"#{request.protocol}#{request.host_with_port}"
pour obtenir l'URL actuelle.
Vous pouvez utiliser:
request.full_path
ou
request.url
J'espère que cela résoudra votre problème.
À votre santé
Pour obtenir l'URL absolue, ce qui signifie from the root
qu'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