¿Cómo obtengo la URL absoluta actual en Ruby on Rails?

Respuestas:

1443

Para Rails 3.2 o Rails 4+

Debe usar request.original_urlpara obtener la URL actual.

Este método está documentado en el método original_url , pero si tiene curiosidad, la implementación es:

def original_url
  base_url + original_fullpath
end

Para rieles 3:

Puedes escribir "#{request.protocol}#{request.host_with_port}#{request.fullpath}", ya request.urlque ahora está en desuso.


Para rieles 2:

Puedes escribir en request.urllugar de request.request_uri. Esto combina el protocolo (generalmente http: //) con el host y request_uri para darle la dirección completa.

Manish Shrivastava
fuente
31
como señalaron otros usuarios: ADVERTENCIA DE DEPRECACIÓN: El uso de #request_uri está en desuso. Utilice fullpath en su lugar
giladbu
99
¡@giladbu fullpathNO incluye el protocolo / dominio / puerto! ¡No es una URL absoluta!
Alan H.
37
"http://#{request.host+request.fullpath}"funcionará o no, (si el puerto es importante)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc
77
si el puerto es importante, este funciona bien: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir
3
¿Puede señalar una referencia para el reclamo que request.urlestá en desuso? La solución propuesta es solo un largo camino para decir lo que request.urlya hace; la implementación es simplemente protocolo + host_with_port + fullpath ( github.com/rails/rails/blob/… )
mhartl
134

Creo que el método Ruby on Rails 3.0 es ahora request.fullpath.

mcr
fuente
13
fullpath no incluye el dominio
lulalala
Me alegro de que esto se haya proporcionado ya que en realidad estaba buscando cómo no incluir el dominio.
Jake
121

Podrías usar url_for(only_path: false)

grzuy
fuente
En mi (un caso un poco especial) esto fue casi exactamente lo que quería. Acabo de cambiar la opción a verdadero y obtuve la URL de la página actual, sin opciones. Gracias :)
Spiralis
@David no está en la Vista, no lo hace. Pero de todos modos no debería usarse allí =)
Lyuben Todorov
En mi caso, quería cambiar el nombre de host pero mantener todo lo demás. Descubrí que url_for (host: 'www.nuevodominio.com') funcionó mejor para mí como una solución al problema. OMI, es una solución más robusta ya que es la misma en todas las versiones de rieles.
PeppyHeppy
1
FYI Esto no funcionará si tiene varias rutas para el mismo recurso.
thekingoftruth
68

ADVERTENCIA DE DEPRECACIÓN: El uso de #request_uri está en desuso . Utilice fullpath en su lugar.

ecoologico
fuente
44
Consulte las notas sobre la respuesta stackoverflow.com/a/2165727/166279 , fullpath no incluye el dominio.
Nilloc 01 de
esta línea vino directamente del registro al momento de escribir cuando se usa request.uriy esto ya se ha señalado varias veces en esta pregunta, pero ... ok, gracias
ecoologic
1
@ManishShrivastava: divertido, a pesar de todo el esfuerzo "original" que puse respondiendo preguntas más complejas, este copiar y pegar me dio el puntaje más alto, bueno ... mejor que nada
ecoológico
52

Puede agregar este método current_url en ApplicationController para devolver la URL actual y permitir la fusión en otros parámetros

# 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

Ejemplo de uso:

current_url --> http://...
current_url(:page=>4) --> http://...&page=4
más asqueroso
fuente
1
Esto no parece estar definido en Rails 3.1.
Alan H.
1
podrías hacerlo de esta maneraurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike
2
Además, si está en un link_tosolo puede usar params.mergey omitir el url_forconjunto
montrealmike
36

Para Ruby on Rails 3:

request.url
request.host_with_port

Inicié una sesión de depurador y consulté el objeto de solicitud:

request.public_methods
Duque
fuente
32

En Ruby on Rails 3.1.0.rc4:

 request.fullpath
Lucas Renan
fuente
55
fullpathno proporciona un absolute URLcomo el cartel original solicitado.
Olivier Lacan
28

Necesitaba la URL de la aplicación pero con el subdirectorio. Solía:

root_url(:only_path => false)
dorio
fuente
27
 url_for(params)

Y puede agregar fácilmente algún parámetro nuevo:

url_for(params.merge(:tag => "lol"))
Yuri Barbashov
fuente
55
Esto es mucho más elegante (aunque menos granular) que la respuesta aprobada.
Olivier Lacan
16

Creo que request.domain funcionaría, pero ¿qué pasa si estás en un subdirectorio como blah.blah.com? Algo como esto podría funcionar:

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

Cambie los parámetros según su estructura de ruta.

¡Espero que ayude!

James M
fuente
8
Sí, la respuesta de Jaime es mucho mejor, pero si quieres ser realmente ineficiente, puedes hacerlo a mi manera.
James M
14

Parece que request_uriestá en desuso en Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.
Ken Earley
fuente
13

Usando Ruby 1.9.3-p194 y Ruby on Rails 3.2.6:

Si request.fullpath no funciona para usted, intente request.env ["HTTP_REFERER"]

Aquí está mi historia a continuación.

Tengo un problema similar al detectar la URL actual (que se muestra en la barra de direcciones del usuario en su navegador) para páginas acumulativas que combinan información de diferentes controladores, por ejemplo, http://localhost:3002/users/1/history/issues .

El usuario puede cambiar a diferentes listas de tipos de problemas. Todas esas listas se cargan a través de Ajax desde diferentes controladores / parciales (sin recargar).

El problema era establecer la ruta correcta para el botón Atrás en cada elemento de la lista para que el botón Atrás pudiera funcionar correctamente tanto en su propia página como en el historial acumulativo de la página .

En caso de que use request.fullpath , devuelve la ruta de la última solicitud de JavaScript, que definitivamente no es la URL que estoy buscando.

Entonces utilicé request.env ["HTTP_REFERER"] que almacena la URL de la última solicitud recargada.

Aquí hay un extracto del parcial para tomar una decisión.

- 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
Serge Seletskyy
fuente
Sí, fullpath te da la url que solicitaste, no la url de la que viniste , que es lo que yo también necesitaba. ¡Gracias por esto!
Spencer Rathbun
2
Funciona muy bien, justo lo que necesitaba. Sin embargo, esto debería estar en una pregunta y respuesta separadas. Un poco difícil de encontrar aquí. : /
DDDD
12

Esto funciona para Ruby on Rails 3.0 y debería ser compatible con la mayoría de las versiones de Ruby on Rails:

request.env['REQUEST_URI']
Tim Santeford
fuente
11

Ninguna de las sugerencias aquí en el hilo me ayudó tristemente, excepto la que alguien dijo que usó el depurador para encontrar lo que buscaba.

Creé algunas páginas de error personalizadas en lugar de las estándar 404 y 500, pero request.urlterminé en /404lugar de lo esperado /non-existing-mumbo-jumbo.

Lo que necesitaba usar era

request.original_url
Frans
fuente
9

Si por pariente te refieres solo sin el dominio, entonces busca request.domain.

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

Puedes usar el método ruby:

:root_url

que obtendrá la ruta completa con la URL base:

localhost:3000/bla
Idan Wender
fuente
Esta es la única solución que funciona en serializadores que utilizan active_model_serializers en Rails 4.
Kris Khaira
¿Puede decirme cómo puedo restringir los parámetros que paso a una URL absoluta cuando uso algo como :root_urlpara obtener la URL absoluta? Suponga que estoy usin algo así some_method(:products_brand_url, brand: brand, entity_name: "brand")y some_methodse define como `def some_method (route, opts = {}) end` No quiero que mi ruta se vea como - http://localhost:3000/brands/brand_name?&entity_name="brand". Quiero que se vea la ruta http://localhost:3000/brands/brand_name. Solo quiero entity_nameque sea parte del hash de opts y no como un parámetro para la url absoluta.
boddhisattva
Ciertamente no hay un método llamado Rubyroot_url .
smileart
6

Puedes usar cualquiera de los rieles 3.2:

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

Creo que funcionará en todas partes

"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
uma
fuente
6

Carriles 4.0

puede usar request.original_url, la salida será como se muestra a continuación

get "/articles?page=2"

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

Para Rails 3.2 o Rails 4 Simplemente obtenga de esta manera "request.original_url" Referencia: Método URL original

Para Rails 3 Como request.url está en desuso, podemos obtener una ruta absoluta concatenando

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

Para rieles 2

request.url
Amit
fuente
3

si quieres ser específico, es decir, conoces el camino que necesitas:

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

Para rieles 3:

request.fullpath

Pankhuri
fuente
3
request.env["REQUEST_URI"]

funciona en rails 2.3.4 probado y no conoce otras versiones.

Satishakumar Awati
fuente
3

Para obtener la URL de solicitud sin ningún parámetro de consulta.

def current_url_without_parameters
  request.base_url + request.path
end
Nervio
fuente
3

Puedes usar

request.original_url 

o

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

para obtener la URL actual.

Robin Garg
fuente
1

Puedes usar:

request.full_path

o

request.url

Esperemos que resuelva tu problema.

Salud

Ali Hassan Mirza
fuente
1

Puede configurar una variable para URI.parse(current_url), todavía no veo esta propuesta aquí y funciona para mí.

RaK427
fuente
0

Para obtener la URL absoluta, lo que significa que from the rootse puede mostrar así

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

El ayudante users_url genera una URL que incluye el protocolo y el nombre de host. El ayudante users_path genera solo la parte de la ruta.

users_url: http://localhost/users
users_path: /users
Ahmad hamza
fuente