Come posso ottenere l'attuale URL assoluto in Ruby on Rails?


Risposte:


1443

Per Rails 3.2 o Rails 4+

Dovresti usare request.original_urlper ottenere l'URL corrente.

Questo metodo è documentato nel metodo original_url , ma se sei curioso, l'implementazione è:

def original_url
  base_url + original_fullpath
end

Per Rails 3:

Puoi scrivere "#{request.protocol}#{request.host_with_port}#{request.fullpath}", poiché request.urlora è deprecato.


Per Rails 2:

Puoi scrivere request.urlinvece di request.request_uri. Questo combina il protocollo (di solito http: //) con l'host e request_uri per fornire l'indirizzo completo.


31
come altri utenti hanno indicato: AVVISO DI DEPRECAZIONE: L'uso di #request_uri è obsoleto. Utilizzare invece fullpath
giladbu,

9
@giladbu fullpathNON include il protocollo / dominio / porta! Non è un URL assoluto!
Alan H.

37
"http://#{request.host+request.fullpath}"funzionerà o meno, (se il porto è importante)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc,

7
se importante, questo funziona bene: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir,

3
Puoi indicare un riferimento per il reclamo che request.urlè obsoleto? La soluzione proposta è solo un lungo modo di dire ciò che request.urlgià fa; l'implementazione è semplicemente protocollo + host_with_port + fullpath ( github.com/rails/rails/blob/… )
mhartl

134

Penso che il metodo Ruby on Rails 3.0 sia ora request.fullpath.


13
fullpath non include il dominio
lulalala

Sono contento che questo sia stato fornito mentre stavo effettivamente cercando come non includere il dominio.
Jake,

121

Puoi usare url_for(only_path: false)


Nel mio (un po 'caso speciale) questo era quasi esattamente quello che volevo. Ho appena cambiato l'opzione in true e ho ottenuto l'URL per la pagina corrente, senza opzioni. Grazie :)
Spiralis,

@David non nella vista non lo fa. Ma non dovrebbe essere usato lì =)
Lyuben Todorov il

Nel mio caso volevo cambiare il nome host ma mantenere tutto il resto. Ho scoperto che url_for (host: "www.newdomain.com") ha funzionato al meglio per me come soluzione al problema. IMO, è una soluzione più solida poiché è la stessa in tutte le versioni di binari.
PeppyHeppy il

1
FYI Questo non funzionerà se si hanno più percorsi per la stessa risorsa.
thekingoftruth,

68

ATTENZIONE: L' utilizzo di #request_uri è deprecato . Usa invece fullpath.


4
Vedi le note sulla risposta stackoverflow.com/a/2165727/166279 , il percorso completo non include il dominio.
Nilloc,

questa riga proveniva direttamente dal registro al momento della scrittura durante l'uso request.urie questo è già stato sottolineato più volte in questa domanda, ma ... ok, grazie
ecoologic

1
@ManishShrivastava: divertente, nonostante tutto lo sforzo "originale" che ho posto per rispondere a domande più complesse, questa copia e incolla mi ha dato il punteggio più alto, beh ... meglio di niente
ecoologico


52

È possibile aggiungere questo metodo current_url in ApplicationController per restituire l'URL corrente e consentire l'unione in altri parametri

# 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

Esempio di utilizzo:

current_url --> http://...
current_url(:page=>4) --> http://...&page=4

1
Ciò non sembra essere definito in Rails 3.1.
Alan H.

1
potresti farlo in questo modourl_for params.merge(:format => "PDF", :only_path => false)
montrealmike,

2
anche se sei in un link_topuoi semplicemente usare params.mergee saltare del url_fortutto
montrealmike

36

Per Ruby on Rails 3:

request.url
request.host_with_port

Ho avviato una sessione di debugger e ho interrogato l'oggetto richiesta:

request.public_methods


28

Avevo bisogno dell'URL dell'applicazione ma con la sottodirectory. Ero solito:

root_url(:only_path => false)

27
 url_for(params)

E puoi facilmente aggiungere alcuni nuovi parametri:

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

5
Questo è molto più elegante (se meno granulare) della risposta approvata.
Olivier Lacan,

16

Penso che request.domain funzionerebbe, ma cosa succede se ti trovi in ​​una sottodirectory come blah.blah.com? Qualcosa del genere potrebbe funzionare:

<%= request.env["HTTP_HOST"] + page = "/" + request.path_parameters['controller'] + "/" + request.path_parameters['action'] %>

Modifica i parametri in base alla struttura del tuo percorso.

Spero che aiuti!


8
Sì, la risposta di Jaime è decisamente migliore, ma se vuoi essere davvero inefficiente, potresti farlo a modo mio.
James M,

14

Sembra che request_urisia deprecato in Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.

13

Utilizzando Ruby 1.9.3-p194 e Ruby on Rails 3.2.6:

Se request.fullpath non funziona per te, prova request.env ["HTTP_REFERER"]

Ecco la mia storia qui sotto.

Ho riscontrato un problema simile con il rilevamento dell'URL corrente (che viene mostrato nella barra degli indirizzi per l'utente nel suo browser) per le pagine cumulative che combinano informazioni provenienti da controller diversi, ad esempio http://localhost:3002/users/1/history/issues.

L'utente può passare a diversi elenchi di tipi di problemi. Tutti questi elenchi vengono caricati tramite Ajax da controller / parziali diversi (senza ricaricare).

Il problema era impostare il percorso corretto per il pulsante Indietro in ogni elemento dell'elenco in modo che il pulsante Indietro potesse funzionare correttamente sia nella propria pagina che nella cronologia cumulativa delle pagine .

Nel caso in cui utilizzo request.fullpath , restituisce il percorso dell'ultima richiesta JavaScript che non è sicuramente l'URL che sto cercando.

Quindi ho usato request.env ["HTTP_REFERER"] che memorizza l'URL dell'ultima richiesta ricaricata.

Ecco un estratto dal parziale per prendere una decisione

- 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

Sì, fullpath ti dà l'url che hai richiesto, non l'url da cui sei venuto , che è anche quello di cui avevo bisogno. Grazie per questo!
Spencer Rathbun,

2
Funziona alla grande, proprio quello di cui avevo bisogno. Questo dovrebbe essere in una domanda e risposta separate però. Difficile da trovare qui. : /
DDDD

12

Questo funziona per Ruby on Rails 3.0 e dovrebbe essere supportato dalla maggior parte delle versioni di Ruby on Rails:

request.env['REQUEST_URI']

11

Nessuno dei suggerimenti qui nel thread mi ha aiutato tristemente, tranne quello in cui qualcuno ha detto che ha usato il debugger per trovare quello che cercava.

Ho creato alcune pagine di errore personalizzate invece degli standard 404 e 500, ma sono request.urlterminate /404invece del previsto /non-existing-mumbo-jumbo.

Quello che dovevo usare era

request.original_url

9

Se per parente, intendi solo senza il dominio, allora cerca request.domain.


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

8

Puoi usare il metodo ruby:

:root_url

che otterrà il percorso completo con l'URL di base:

localhost:3000/bla

Questa è l'unica soluzione che funziona nei serializzatori usando active_model_serializers in Rails 4.
Kris Khaira,

Potete per favore dirmi come posso limitare i parametri che passo a un url assoluto quando uso qualcosa di simile :root_urlper ottenere l'url assoluto? Supponiamo che io stia usando qualcosa del genere some_method(:products_brand_url, brand: brand, entity_name: "brand")ed some_methodè definito come `def some_method (route, opts = {}) end` Non voglio che il mio percorso assomigli - http://localhost:3000/brands/brand_name?&entity_name="brand". Voglio che il percorso sia simile http://localhost:3000/brands/brand_name. Voglio solo che entity_namefaccia parte dell'hash di opts e non come parametro dell'URL assoluto.
boddhisattva,

Certamente non esiste un metodo Ruby chiamato root_url.
smileart


6

puoi usarne uno qualsiasi per le rotaie 3.2:

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

Penso che funzionerà ovunque

"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"

6

Rotaie 4.0

è possibile utilizzare request.original_url, l'output sarà come indicato nell'esempio seguente

get "/articles?page=2"

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

4

Per Rails 3.2 o Rails 4 Ottenere semplicemente in questo modo "request.original_url" Riferimento: Metodo URL originale

Per Rails 3 Poiché request.url è obsoleto. È possibile ottenere il percorso assoluto concatenando

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

Per binari 2

request.url

3

se vuoi essere specifico, nel senso, conosci il percorso di cui hai bisogno:

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



3

Per ottenere l'URL della richiesta senza parametri di query.

def current_url_without_parameters
  request.base_url + request.path
end

3

Puoi usare entrambi

request.original_url 

o

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

per ottenere l'URL corrente.


1

Puoi usare:

request.full_path

o

request.url

Spero che risolva il tuo problema.

Saluti


1

Puoi impostare una variabile su URI.parse(current_url), non vedo ancora questa proposta qui e funziona per me.


0

Per ottenere l'URL assoluto, il che significa che from the rootpuò essere visualizzato in questo modo

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

L'helper users_url genera un URL che include il protocollo e il nome host. L'helper users_path genera solo la parte del percorso.

users_url: http://localhost/users
users_path: /users
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.