题 如何在Ruby on Rails中获取当前的绝对URL?


我怎样才能获得最新信息 绝对URL 在我的Ruby on Rails视图中?

request.request_uri 仅返回相对URL。


939
2018-01-29 22:32


起源


你可以看看rails 4: blog.grepruby.com/2015/04/absolute-url-full-url-in-rails-4.html - user3118220


答案:


对于Rails 3.2或Rails 4+

你应该用 request.original_url 获取当前的URL。

该方法记录在 original_url方法,但如果你很好奇,那么实施是:

def original_url
  base_url + original_fullpath
end

对于Rails 3:

你可以写 "#{request.protocol}#{request.host_with_port}#{request.fullpath}"从那以后 request.url 现已弃用。


对于Rails 2:

你可以写 request.url 代替 request.request_uri。这将协议(通常是http://)与主机相结合,而request_uri则为您提供完整的地址。


1324
2018-01-07 20:20



正如其他用户所指出的:弃用警告:不推荐使用#request_uri。请改用完整路径 - giladbu
@giladbu fullpath 不包括协议/域/端口!这不是一个绝对的URL! - Alan H.
"http://#{request.host+request.fullpath}" 将工作或以其他方式,(如果端口很重要) "http://#{request.host}:#{request.port+request.fullpath}" - Nilloc
如果端口重要,这个工作正常: "http://#{request.host}:#{request.port}#{request.fullpath}" - Sucrenoir
request.url在rails 3.0.3上为我工作 - Magesh


我认为现在是Ruby on Rails 3.0方法 request.fullpath


126
2017-10-07 17:18



fullpath不包括域 - lulalala


你可以用 url_for(:only_path => false)


113
2017-12-07 18:21



在我(有点特殊情况)中,这几乎就是我想要的。我只是将选项更改为true并获取当前页面的URL,没有选项。谢谢 :) - Spiralis
只使用url_for(没有参数)也可以。 - David Morales
@David不在View中没有。但它不应该在那里使用=) - Lyuben Todorov
在我的情况下,我想改变主机名,但保留其他一切。我发现url_for(主机:'www.newdomain.com')对我来说是最好的解决方案。 IMO,它是一个更强大的解决方案,因为它在所有版本的rails中都是相同的。 - PeppyHeppy
FYI如果您有相同资源的多个路径,则无效。 - thekingoftruth


弃权警告: 不推荐使用#request_uri。请改用完整路径。


64
2017-07-02 13:30



请参阅答案说明 stackoverflow.com/a/2165727/166279,fullpath不包括域。 - Nilloc
这条线在使用时直接来自日志 request.uri 在这个问题中已经多次指出这一点,但是......好的,谢谢 - ecoologic
哈哈,绝对真实的警告,回答...... !!! - Manish Shrivastava
@ManishShrivastava:很有趣,尽管我提出了所有“原创”的努力来回答更复杂的问题,但这个副本和粘贴给了我最高分,嗯......总比没有好 - ecoologic


如果你正在使用 Rails 3.2 要么 Rails 4 你应该使用 request.original_url 获取当前的URL。


该方法的文档位于 http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url 但如果你很好奇,实施是:

def original_url
  base_url + original_fullpath
end

56
2017-09-15 07:53



重复的答案。 - courtsimas


你可以添加这个 current_url ApplicationController中的方法返回当前URL并允许合并其他参数

# 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

用法示例:

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

49
2017-08-18 21:21



这似乎没有在Rails 3.1中定义。 - Alan H.
似乎不适用于Rails 3.2。 - plang
你可以这样做 url_for params.merge(:format => "PDF", :only_path => false) - montrealmike
如果你在 link_to 你可以使用 params.merge 并跳过 url_for 共 - montrealmike


对于Ruby on Rails 3:

request.url
request.host_with_port

我启动了调试器会话并查询了请求对象:

request.public_methods

34
2017-07-13 14:55





在Ruby on Rails 3.1.0.rc4中:

 request.fullpath

30
2017-10-28 22:55



fullpath 不提供 absolute URL 正如原始海报要求的那样。 - Olivier Lacan