ti-enxame.com

Como obtenho o URL absoluto atual em Ruby on Rails?

Como posso obter a URL atual absoluta na minha visualização Ruby on Rails?

O request.request_uri retorna apenas o URL relativo.

979
Jakub Arnold

Para Rails 3.2 ou Rails 4+

Você deve usar request.original_url para obter o URL atual.

Este método está documentado em original_url method , mas se você está 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}", já que request.url está sendo reprovado.


Para Rails 2:

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

1366
Jaime Bellmyer

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

130
mcr

Você poderia usar url_for(:only_path => false)

114
grzuy

DEPRECATION WARNING: Usando #request_uri está obsoleto . Use fullpath em vez disso. 

67
ecoologic

Se você estiver usando Rails 3.2 ou Rails 4 você deve usar request.original_url para obter o URL atual.


A documentação para o método está em http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url mas se você está curioso, a implementação é:

def original_url
  base_url + original_fullpath
end
58
Mike

Você pode adicionar este current_url método no ApplicationController para retornar a URL atual e permitir a mesclagem em 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
50
grosser

Para Ruby on Rails 3:

request.url
request.Host_with_port

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

request.public_methods
35
Duke

Em Ruby on Rails 3.1.0.rc4:

 request.fullpath
31
Lucas Renan

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

root_url(:only_path => false)
28
Dorian
 url_for(params)

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

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

Eu acho que request.domain iria funcionar, mas e se você estiver em um subdiretório como blah.blah.com? Algo como isso 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!

15
James M

Parece que request_uri está obsoleto em Ruby on Rails 3.

Using #request_uri is deprecated. Use fullpath instead.
14
Ken Earley

Usando o Ruby 1.9.3-p194 e o Ruby on Rails 3.2.6:

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

Aqui está minha história abaixo.

Eu tenho problema semelhante com a detecção de URL atual (que é mostrada 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 funcionasse corretamente tanto na sua própria página quanto na página cumulativa history.

Caso eu use request.fullpath , ele retorna o caminho da última requisição JavaScript que definitivamente não é a URL que estou procurando.

Então eu usei request.env ["HTTP_REFERER"] que armazena o URL da última requisiçã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
13
Serge Seletskyy

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']
12
Tim Santeford

Nenhuma das sugestões aqui no tópico me ajudou com tristeza, 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 do padrão 404 e 500, mas request.url terminou em /404 em vez do /non-existing-mumbo-jumbo esperado.

O que eu precisava usar era

request.original_url
11
Frans

Se por parente, você quer dizer apenas sem o domínio, então olhe para request.domain.

9
ghoppe

Você pode usar o método Ruby:

:root_url

que irá obter o caminho completo com o URL base:

localhost:3000/bla
9
Idan Wender
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
8
msroot

No Rails 3 você pode usar

request.original_url

http://apidock.com/Rails/v3.2.8/ActionDispatch/Request/original_url

6
mikrobi

Trilhos 4.0

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

get "/articles?page=2"

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

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

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

Você pode usar 

request.original_url 

ou 

"#{request.protocol}#{request.Host_with_port}" 

para obter o URL atual.

3
Robin Garg

Para Rails 3:

request.fullpath

3
Pankhuri

For Rails 3.2 or Rails 4 Simplesmente entre desta forma "request.original_url" Referência: Original URL Method

For Rails 3 Como request.url é obsoleto. Podemos obter caminho absoluto concatenando

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

Para trilhos 2

request.url
3
Amit

você pode usar qualquer um para o Rails 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}"
3
uma
request.env["REQUEST_URI"]

funciona no Rails 2.3.4 testado e não sabe sobre outras versões.

2
Satishakumar Awati

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

def current_url_without_parameters
  request.base_url + request.path
end
2
Nerve

Você pode usar:

request.full_path

ou 

request.url

Espero que isso resolva seu problema.

Felicidades

1
Ali Hassan Mirza

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

1
RaK427

Para Rails 3.xe acima:

#{request.protocol}#{request.Host_with_port}#{request.fullpath}

Para Rails 3.2 e acima:

request.original_url

Porque no Rails 3.2 e acima:

request.original_url = request.base_url + request.original_fullpath

Para mais informações, visite plese http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url

0
V K Singh

Rails 4

Controlador:

def absolute_url
  request.base_url + request.original_fullpath
end

Action Mailer Alterações notáveis ​​em 4.2 release :

link_to e url_para gerar URLs absolutos por padrão em modelos, não é mais necessário passar only_path: false. (Commit)

Visão:

Se você usar o sufixo _url, o URL gerado será absoluto. Use _path para obter um URL relativo.

<%= link_to "Home", root_url %>

Para mais detalhes, vá para:

http://blog.grepruby.com/2015/04/absolute-url-full-url-in-Rails-4.html

0
user3118220

Para obter o URL absoluto, o que significa que o from the root 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 auxiliar users_path gera apenas a parte do caminho.

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