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

¿Cómo puedo obtener la corriente? URL absoluta en mi vista Ruby on Rails?

El request.request_uri solo devuelve el relativo Enlance.

preguntado el 29 de enero de 10 a las 22:01

30 Respuestas

Para Rails 3.2 o Rails 4+

Deberías usar request.original_url para obtener la URL actual.

Este método está documentado en 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}", Desde request.url ahora está en desuso


Para rieles 2:

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

contestado el 12 de mayo de 18 a las 10:05

como señalaron otros usuarios: ADVERTENCIA DE DEPRECATION: El uso de #request_uri está desaprobado. Use fullpath en su lugar - giladbu

@giladbu fullpath NO incluye el protocolo / dominio / puerto! ¡No es una URL absoluta! - Alan H.

"http://#{request.host+request.fullpath}" funcionará o no, (si el puerto es importante) "http://#{request.host}:#{request.port+request.fullpath}" - Nilloc

si el puerto es importante, este funciona bien: "http://#{request.host}:#{request.port}#{request.fullpath}" - Sucrenoir

¿Puede señalar una referencia para la afirmación de que request.url ¿es obsoleto? La solución propuesta es solo un largo camino para decir lo que request.url ya lo hace; la implementación es simplemente protocolo + host_with_port + fullpath (github.com/rails/rails/blob/…) - mhartl

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

Respondido el 07 de Septiembre de 12 a las 19:09

fullpath no incluye el dominio - lulalala

Me alegro de que se haya proporcionado, ya que en realidad estaba buscando cómo no incluir el dominio. - Jake

Podrías usar url_for(only_path: false)

Respondido 14 Oct 19, 22:10

En mi (un caso un poco especial) esto era casi exactamente lo que quería. Acabo de cambiar la opción a verdadera y obtuve la URL de la página actual, sin opciones. Gracias :) - Spiralis

@David no está en la Vista, no lo hace. Pero no debería usarse allí de todos modos =) - Lyuben Todorov

En mi caso, quería cambiar el nombre de host pero mantener todo lo demás. Descubrí que url_for (host: 'www.newdomain.com') funcionó mejor para mí como solución al problema. En mi opinión, es una solución más robusta ya que es la misma en todas las versiones de rieles. - PeppyHeppy

Para su información, esto no funcionará si tiene varias rutas para el mismo recurso. - el rey de la verdad

ADVERTENCIA DE DEPRECACIÓN: El uso de #request_uri está obsoleto. En su lugar, utilice fullpath.

contestado el 13 de mayo de 13 a las 06:05

Ver notas sobre la respuesta stackoverflow.com/a/2165727/166279, fullpath no incluye el dominio. - Nilloc

esta línea vino directamente del registro al momento de escribir cuando se usa request.uri y esto ya se ha señalado varias veces en esta pregunta, pero ... ok, gracias - ecoológico

@ManishShrivastava: gracioso, a pesar de todo el esfuerzo "original" que puse respondiendo preguntas más complejas, este copiar y pegar me dio la puntuación más alta, bueno ... mejor que nada - ecoológico

Si estás usando Rails 3.2 or Rails 4 Deberías usar request.original_url para obtener la URL actual.


La documentación del método se encuentra en http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url pero si tiene curiosidad, la implementación es:

def original_url
  base_url + original_fullpath
end

Respondido 26 Jul 13, 19:07

Puedes agregar esto current_url en el 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

Respondido 23 ago 17, 07:08

Esto no parece estar definido en Rails 3.1. - Alan H.

podrías hacerlo de esta manera url_for params.merge(:format => "PDF", :only_path => false) - Montreal

también si estás en un link_to puedes usar params.merge y omita el url_for en conjunto - Montreal

Para Ruby on Rails 3:

request.url
request.host_with_port

Encendí una sesión de depuración y consulté el objeto de solicitud:

request.public_methods

Respondido el 07 de Septiembre de 12 a las 19:09

En Ruby on Rails 3.1.0.rc4:

 request.fullpath

Respondido el 07 de Septiembre de 12 a las 19:09

fullpath no proporciona una absolute URL como solicitó el cartel original. - Olivier Lacan

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

root_url(:only_path => false)

Respondido el 07 de Septiembre de 12 a las 19:09

 url_for(params)

Y puede agregar fácilmente algunos parámetros nuevos:

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

Respondido el 07 de Septiembre de 12 a las 19:09

Esto es mucho más elegante (aunque menos detallado) que la respuesta aprobada. - Olivier Lacan

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 la estructura de su ruta.

Espero que ayude!

Respondido el 30 de enero de 10 a las 01:01

Sí, la respuesta de Jaime es mucho mejor, pero si quieres ser realmente ineficiente, puedes hacerlo a mi manera. - James m

Parece que request_uri está en desuso en Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.

Respondido el 07 de Septiembre de 12 a las 19:09

Usando Ruby 1.9.3-p194 y Ruby on Rails 3.2.6:

If request.fullpath no funciona para ti, inténtalo request.env ["HTTP_REFERER"]

Aquí está mi historia a continuación.

Tuve 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 de retroceso en cada elemento de la lista para que el botón de retroceso pudiera funcionar correctamente tanto en su propia página como en la página acumulativa. historia.

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 usé 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

Respondido el 07 de Septiembre de 12 a las 19:09

Sí, fullpath le proporciona la URL que solicitó, no la URL que vino de, que es lo que también necesitaba. ¡Gracias por esto! - Spencer Rathbun

Funciona muy bien, justo lo que necesitaba. Sin embargo, esto debería ser en una pregunta y respuesta separadas. Un poco difícil de encontrar aquí. : / - DDDD

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

Respondido el 07 de Septiembre de 12 a las 19:09

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

He creado algunas páginas de error personalizadas en lugar de las 404 y 500 estándar, pero request.url terminó en /404 en lugar de lo esperado /non-existing-mumbo-jumbo.

Lo que necesitaba usar era

request.original_url

Respondido 04 Abr '13, 16:04

Si por relativo te refieres simplemente sin el dominio, entonces mira en request.domain.

Respondido el 07 de Septiembre de 12 a las 19:09

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

contestado el 11 de mayo de 12 a las 11:05

Puedes usar el método ruby:

:root_url

que obtendrá la ruta completa con la URL base:

localhost:3000/bla

Respondido 03 Abr '18, 12:04

Esta es la única solución que funciona en serializadores que usan 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_url para obtener la URL absoluta? Asume que estoy usando algo como some_method(:products_brand_url, brand: brand, entity_name: "brand") y some_method se define como `def some_method (route, opts = {}) end` No quiero que mi ruta se vea así - http://localhost:3000/brands/brand_name?&entity_name="brand". Quiero que la ruta se parezca http://localhost:3000/brands/brand_name. Solo quiero el entity_name para ser parte del hash de opts y no como parámetro de la URL absoluta. - Bodhisattva

Ciertamente no hay Rubí método llamado root_url. - smileart

respondido 13 mar '13, 15:03

puede usar cualquiera para 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}"

respondido 11 mar '14, 09:03

Rails 4.0

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

respondido 26 mar '15, 17:03

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

Para rieles 3 Como request.url está obsoleto, podemos obtener una ruta absoluta concatenando

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

Para rieles 2

request.url

contestado el 12 de mayo de 18 a las 11:05

si quiere ser específico, es decir, conoce la ruta que necesita:

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

Respondido el 02 de enero de 13 a las 02:01

Para raíles 3:

request.fullpath

Respondido 10 ago 13, 12:08

request.env["REQUEST_URI"]

Funciona en rails 2.3.4 probado y no conozco otras versiones.

respondido 03 mar '14, 01:03

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

def current_url_without_parameters
  request.base_url + request.path
end

Respondido 09 Abr '15, 16:04

Puedes usar

request.original_url 

or

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

para obtener la URL actual.

Respondido el 02 de diciembre de 15 a las 10:12

Puedes usar:

request.full_path

or

request.url

Con suerte, resolverá tu problema.

¡Salud

Respondido 18 ago 15, 08:08

Puede establecer una variable para URI.parse(current_url), Todavía no veo esta propuesta aquí y me funciona.

respondido 04 mar '16, 23:03

Para obtener la URL absoluta, lo que significa que from the root se 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

Respondido el 12 de diciembre de 12 a las 18:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.