Como posso obter o URL absoluto atual na minha visualização Ruby on Rails?
O request.request_uri
único retorna o URL relativo .
Como posso obter o URL absoluto atual na minha visualização Ruby on Rails?
O request.request_uri
único retorna o URL relativo .
Respostas:
Você deve usar request.original_url
para 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
Você pode escrever "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
, pois request.url
agora está obsoleto.
Você pode escrever em request.url
vez de request.request_uri
. Isso combina o protocolo (geralmente http: //) com o host e request_uri para fornecer o endereço completo.
fullpath
NÃO inclui o protocolo / domínio / porta! Não é um URL absoluto!
"http://#{request.host+request.fullpath}"
vai trabalhar ou de outra forma, (se a porta é importante)"http://#{request.host}:#{request.port+request.fullpath}"
"http://#{request.host}:#{request.port}#{request.fullpath}"
request.url
foi descontinuada? A solução proposta é apenas um longo caminho para dizer o que request.url
já faz; a aplicação é simplesmente protocolo + host_with_port + fullpath ( github.com/rails/rails/blob/... )
Você poderia usar url_for(only_path: false)
DEPRECAÇÃO AVISO: O uso de #request_uri foi descontinuado . Use o caminho completo.
request.uri
e isso já tem sido apontado várias vezes nesta questão, mas ... ok, graças
Se você estiver usando o Rails 3.2 ou o Rails 4 , use 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ê estiver curioso, a implementação é:
def original_url
base_url + original_fullpath
end
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
url_for params.merge(:format => "PDF", :only_path => false)
link_to
você pode apenas usar params.merge
e pular o url_for
completamente
No Ruby on Rails 3.1.0.rc4:
request.fullpath
fullpath
não fornece um absolute URL
como o cartaz original solicitado.
url_for(params)
E você pode adicionar facilmente algum novo parâmetro:
url_for(params.merge(:tag => "lol"))
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!
Parece que request_uri
está obsoleto no Ruby on Rails 3.
Using #request_uri is deprecated. Use fullpath instead.
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
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']
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.url
terminei em /404
vez do esperado /non-existing-mumbo-jumbo
.
O que eu precisava usar era
request.original_url
Você pode usar o método ruby:
:root_url
que obterá o caminho completo com o URL base:
localhost:3000/bla
:root_url
o URL absoluto? Suponha que eu esteja usando algo parecido some_method(:products_brand_url, brand: brand, entity_name: "brand")
e some_method
seja 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_name
que ele faça parte do hash dos opts e não como um parâmetro para o URL absoluto.
root_url
.
No Rails 3 você pode usar
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
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"
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
request.env["REQUEST_URI"]
funciona nos trilhos 2.3.4 testados e não conhece outras versões.
Você pode usar
request.original_url
ou
"#{request.protocol}#{request.host_with_port}"
para obter o URL atual.
Você pode usar:
request.full_path
ou
request.url
Espero que isso resolva seu problema.
Felicidades
Para obter o URL absoluto, significa que from the root
ele 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