¿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.


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.


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)


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.


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

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


28

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

root_url(:only_path => false)

27
 url_for(params)

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

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

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!


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.

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

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']

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

9

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


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

8

Puedes usar el método ruby:

:root_url

que obtendrá la ruta completa con la URL base:

localhost:3000/bla

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}"

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"

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

3

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

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



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

3

Puedes usar

request.original_url 

o

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

para obtener la URL actual.



1

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.