Como obtenho a URL absoluta atual no Ruby on Rails?


Respostas:


1443

Para Rails 3.2 ou Rails 4+

Você deve usar request.original_urlpara obter o URL atual.

Este método está documentado no método original_url , mas se você estiver curioso, a implementação é:

def original_url
  base_url + original_fullpath
end

Para Rails 3:

Você pode escrever "#{request.protocol}#{request.host_with_port}#{request.fullpath}", pois request.urlagora está obsoleto.


Para Rails 2:

Você pode escrever em request.urlvez de request.request_uri. Isso combina o protocolo (geralmente http: //) com o host e request_uri para fornecer o endereço completo.


31
como outros usuários apontaram: DEPRECATION WARNING: O uso de #request_uri foi descontinuado. Use fullpath em vez disso
giladbu

9
@giladbu fullpathNÃO inclui o protocolo / domínio / porta! Não é um URL absoluto!
Alan H.

37
"http://#{request.host+request.fullpath}"vai trabalhar ou de outra forma, (se a porta é importante)"http://#{request.host}:#{request.port+request.fullpath}"
Nilloc

7
se a porta é importante, esta funciona corretamente: "http://#{request.host}:#{request.port}#{request.fullpath}"
Sucrenoir 19/04/12

3
Você pode apontar para uma referência para a reivindicação que request.urlfoi descontinuada? A solução proposta é apenas um longo caminho para dizer o que request.urljá faz; a aplicação é simplesmente protocolo + host_with_port + fullpath ( github.com/rails/rails/blob/... )
mhartl

134

Eu acho que o método Ruby on Rails 3.0 é agora request.fullpath.


13
fullpath não inclui o domínio
lulalala

Fico feliz que isso tenha sido fornecido, pois eu estava realmente procurando como não incluir o domínio.
Jake

121

Você poderia usar url_for(only_path: false)


No meu (um caso um pouco especial), isso era quase exatamente o que eu queria. Acabei de alterar a opção para true e recebi o URL da página atual, sem opções. Obrigado :)
Spiralis 23/10

@ David não está no View, não. Mas should'n ser usado lá de qualquer maneira =)
Lyuben Todorov

No meu caso, eu queria mudar o nome do host, mas manter todo o resto. Eu descobri que url_for (host: 'www.newdomain.com') funcionou melhor para mim como uma solução para o problema. IMO, é uma solução mais robusta, pois é a mesma em todas as versões de trilhos.
PeppyHeppy

1
FYI Isso não funcionará se você tiver vários caminhos para o mesmo recurso.
Thekingoftruth

68

DEPRECAÇÃO AVISO: O uso de #request_uri foi descontinuado . Use o caminho completo.


4
Consulte as notas na resposta stackoverflow.com/a/2165727/166279 , o caminho completo não inclui o domínio.
Nilloc 01/02

esta linha veio direto do log no momento da escrita ao usar request.urie isso já tem sido apontado várias vezes nesta questão, mas ... ok, graças
ecoologic

1
@ManishShrivastava: engraçado, apesar de todo o esforço "original" Coloquei respondendo a perguntas mais complexas, este copiar e colar me deu a maior pontuação, bem ... melhor do que nada
ecoologic


52

Você pode adicionar esse método current_url no ApplicationController para retornar a URL atual e permitir a mesclagem com outros 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

Exemplo de uso:

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

1
Isso não parece estar definido no Rails 3.1.
Alan H.

1
você poderia fazê-lo desta maneiraurl_for params.merge(:format => "PDF", :only_path => false)
montrealmike

2
Além disso, se você estiver em um link_tovocê pode apenas usar params.mergee pular o url_forcompletamente
montrealmike

36

Para Ruby on Rails 3:

request.url
request.host_with_port

Eu iniciei uma sessão de depurador e consultei o objeto de solicitação:

request.public_methods


28

Eu precisava do URL do aplicativo, mas com o subdiretório. Eu usei:

root_url(:only_path => false)

27
 url_for(params)

E você pode adicionar facilmente algum novo parâmetro:

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

5
Isso é muito mais elegante (se menos granular) do que a resposta aprovada.
Olivier Lacan

16

Eu acho que request.domain funcionaria, mas e se você estiver em um subdiretório como blah.blah.com? Algo assim poderia funcionar:

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

Altere os parâmetros com base na sua estrutura de caminho.

Espero que ajude!


8
Sim, a resposta de Jaime é muito melhor, mas se você quer ser realmente ineficiente, pode fazer do meu jeito.
James M

14

Parece que request_uriestá obsoleto no Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.

13

Usando Ruby 1.9.3-p194 e Ruby on Rails 3.2.6:

Se request.fullpath não funcionar, tente request.env ["HTTP_REFERER"]

Aqui está a minha história abaixo.

Eu tive um problema semelhante ao detectar o URL atual (que é mostrado na barra de endereços do usuário em seu navegador) para páginas cumulativas que combinam informações de diferentes controladores, por exemplo http://localhost:3002/users/1/history/issues.

O usuário pode alternar para diferentes listas de tipos de problemas. Todas essas listas são carregadas via Ajax de diferentes controladores / parciais (sem recarregar).

O problema era definir o caminho correto para o botão voltar em cada item da lista para que o botão voltar pudesse funcionar corretamente em sua própria página e no histórico acumulado da página .

Caso eu use request.fullpath , ele retornará o caminho da última solicitação JavaScript, que definitivamente não é o URL que estou procurando.

Então, usei request.env ["HTTP_REFERER"] que armazena o URL da última solicitação recarregada.

Aqui está um trecho da parcial para tomar uma decisão

- 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

Sim, o caminho completo fornece o URL solicitado, não o URL de onde você veio , que é o que eu também precisava. Obrigado por isso!
Spencer Rathbun

2
Funciona muito bem, exatamente o que eu precisava. Isso deve estar em uma pergunta e resposta separadas. Meio difícil de encontrar aqui. : /
DDDD 07/04

12

Isso funciona para o Ruby on Rails 3.0 e deve ser suportado pela maioria das versões do Ruby on Rails:

request.env['REQUEST_URI']

11

Nenhuma das sugestões aqui no tópico me ajudou tristemente, exceto aquela em que alguém disse que usou o depurador para encontrar o que procurava.

Eu criei algumas páginas de erro personalizadas em vez dos 404 e 500 padrão, mas request.urlterminei em /404vez do esperado /non-existing-mumbo-jumbo.

O que eu precisava usar era

request.original_url

9

Se por parente, você quer dizer apenas sem o domínio, verifique request.domain.


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

8

Você pode usar o método ruby:

:root_url

que obterá o caminho completo com o URL base:

localhost:3000/bla

Esta é a única solução que funciona em serializers usando active_model_serializers em Rails 4.
Kris Khaira

Você pode me dizer como posso restringir os parâmetros que passo para um URL absoluto quando uso algo como :root_urlo URL absoluto? Suponha que eu esteja usando algo parecido some_method(:products_brand_url, brand: brand, entity_name: "brand")e some_methodseja definido como `def some_method (route, opts = {}) end` Eu não quero que minha rota pareça - http://localhost:3000/brands/brand_name?&entity_name="brand". Quero que a rota pareça http://localhost:3000/brands/brand_name. Eu só quero entity_nameque ele faça parte do hash dos opts e não como um parâmetro para o URL absoluto.
boddhisattva

Certamente não há método Ruby chamado root_url.
Smileart 17/05/19


6

você pode usar qualquer um para trilhos 3.2:

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

Eu acho que vai funcionar em todos os lugares

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

6

Rails 4.0

você pode usar request.original_url, a saída será conforme o exemplo abaixo

get "/articles?page=2"

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

4

Para o Rails 3.2 ou Rails 4, basta entrar desta maneira "request.original_url" Referência: Método URL Original

Para Rails 3 Como request.url está obsoleto. Podemos obter um caminho absoluto concatenando

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

Para Rails 2

request.url

3

se você quer ser específico, ou seja, conhece o caminho que precisa:

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


3
request.env["REQUEST_URI"]

funciona nos trilhos 2.3.4 testados e não conhece outras versões.


3

Para obter o URL da solicitação sem nenhum parâmetro de consulta.

def current_url_without_parameters
  request.base_url + request.path
end

3

Você pode usar

request.original_url 

ou

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

para obter o URL atual.


1

Você pode usar:

request.full_path

ou

request.url

Espero que isso resolva seu problema.

Felicidades


1

Você pode definir uma variável como URI.parse(current_url), ainda não vejo essa proposta aqui e funciona para mim.


0

Para obter o URL absoluto, significa que from the rootele pode ser exibido assim

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

O auxiliar users_url gera uma URL que inclui o protocolo e o nome do host. O ajudante users_path gera apenas a parte do caminho.

users_url: http://localhost/users
users_path: /users
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.