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.

Manish Shrivastava
fonte
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.

mcr
fonte
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)

grzuy
fonte
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.

ecológico
fonte
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
mais grosseiro
fonte
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
Duque
fonte
32

No Ruby on Rails 3.1.0.rc4:

 request.fullpath
Lucas Renan
fonte
5
fullpathnão fornece um absolute URLcomo o cartaz original solicitado.
Olivier Lacan
28

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

root_url(:only_path => false)
Dorian
fonte
27
 url_for(params)

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

url_for(params.merge(:tag => "lol"))
Yuri Barbashov
fonte
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!

James M
fonte
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.
Ken Earley
fonte
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
Serge Seletskyy
fonte
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']
Tim Santeford
fonte
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
Frans
fonte
9

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

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

Você pode usar o método ruby:

:root_url

que obterá o caminho completo com o URL base:

localhost:3000/bla
Idan Wender
fonte
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}"
uma
fonte
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"
Arvind singh
fonte
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
Amit
fonte
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)
Victor S
fonte
3

Para trilhos 3:

request.fullpath

Pankhuri
fonte
3
request.env["REQUEST_URI"]

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

Satishakumar Awati
fonte
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
Nervo
fonte
3

Você pode usar

request.original_url 

ou

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

para obter o URL atual.

Robin Garg
fonte
1

Você pode usar:

request.full_path

ou

request.url

Espero que isso resolva seu problema.

Felicidades

Ali Hassan Mirza
fonte
1

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

RaK427
fonte
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
Ahmad hamza
fonte