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

How do I get the current absolute URL in Ruby on Rails?

提问人:Jakub Arnold 提问时间:1/30/2010 最后编辑:Aryan BeezadhurJakub Arnold 更新时间:8/20/2023 访问量:565593

问:

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

only 返回相对 URL。request.request_uri

Ruby-on-Rails Ruby 网址

评论

0赞 user3118220 4/17/2015
您可以查看 rails 4:blog.grepruby.com/2015/04/absolute-url-full-url-in-rails-4.html

答:

9赞 ghoppe 1/30/2010 #1

如果相对,你的意思是没有域,那么看看.request.domain

1506赞 15 revs, 15 users 33%Manish Shrivastava #2

适用于 Rails 3.2 或 Rails 4+

您应该使用来获取当前 URL。当前 repo 的源代码可在此处找到。request.original_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:

您可以编写 .这将协议(通常为 http://)与主机相结合,并request_uri为您提供完整的地址。request.urlrequest.request_uri

评论

32赞 giladbu 4/27/2011
正如其他用户所指出的: 弃用警告:不推荐使用 #request_uri。请改用完整路径
9赞 Alan H. 8/2/2011
@giladbu不包括协议/域/端口!这不是一个绝对的URL!fullpath
38赞 Nilloc 2/2/2012
"http://#{request.host+request.fullpath}"是否有效,(如果端口很重要)"http://#{request.host}:#{request.port+request.fullpath}"
7赞 Sucrenoir 4/19/2012
如果端口很重要,则此端口工作正常:"http://#{request.host}:#{request.port}#{request.fullpath}"
3赞 mhartl 3/23/2013
您能否指出已弃用的声明的引用?所提出的解决方案只是说已经做了什么的很长的路要走;实现简单就是协议 + host_with_port + 完整路径 (github.com/rails/rails/blob/...request.urlrequest.url)
16赞 James M 1/30/2010 #3

我认为request.domain会起作用,但是如果您在像 blah.blah.com 这样的子目录中怎么办?像这样的东西可以工作:

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

根据路径结构更改参数。

希望对您有所帮助!

评论

8赞 James M 1/30/2010
是的,Jaime的答案要好得多,但如果你想真正低效,你可以按照我的方式去做。
52赞 grosser 9/15/2010 #4

您可以在 ApplicationController 中添加此current_url方法以返回当前 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

评论

1赞 Alan H. 8/2/2011
这似乎在 Rails 3.1 中没有定义。
1赞 montrealmike 7/18/2012
你可以这样做url_for params.merge(:format => "PDF", :only_path => false)
2赞 montrealmike 7/18/2012
此外,如果您在 a 中,您可以完全使用并跳过link_toparams.mergeurl_for
67赞 ecoologic 12/8/2010 #5

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

评论

4赞 Nilloc 2/2/2012
请参阅有关答案 stackoverflow.com/a/2165727/166279 的注释,完整路径不包括域。
0赞 ecoologic 2/2/2012
这句话在使用时直接来自撰写本文时的日志,这个问题已经多次指出了这一点,但是......好的,谢谢request.uri
1赞 ecoologic 8/27/2014
@ManishShrivastava:有趣的是,尽管我付出了所有“原始”的努力来回答更复杂的问题,但这次复制和粘贴给了我最高分,嗯......总比没有好
141赞 mcr 1/8/2011 #6

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

评论

14赞 lulalala 5/13/2013
fullpath 不包括域
0赞 Jake 5/19/2020
我很高兴提供了这个,因为我实际上是在寻找如何不包括域。
14赞 Ken Earley 3/2/2011 #7

它似乎在 Ruby on Rails 3 中被弃用了。request_uri

Using #request_uri is deprecated. Use fullpath instead.
32赞 Lucas Renan 7/13/2011 #8

在 Ruby on Rails 3.1.0.rc4 中:

 request.fullpath

评论

5赞 Olivier Lacan 11/8/2012
fullpath未提供原始海报要求的。absolute URL
39赞 Duke 8/19/2011 #9

对于 Ruby on Rails 3:

request.url
request.host_with_port

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

request.public_methods
130赞 grzuy 10/8/2011 #10

你可以使用url_for(only_path: false)

评论

0赞 Spiralis 10/23/2011
在我(有点特殊的情况下)这几乎正是我想要的。我只是将选项更改为 true 并获取了当前页面的 url,没有选项。谢谢:)
0赞 Lyuben Todorov 11/14/2012
@David不在视图中,它不在视图中。但无论如何它不应该在那里使用=)
0赞 PeppyHeppy 12/28/2012
就我而言,我想更改主机名,但保留其他所有内容。我发现url_for(主持人:“www.newdomain.com”)作为解决问题的方法对我来说效果最好。IMO,这是一个更强大的解决方案,因为它在所有版本的轨道上都是相同的。
1赞 thekingoftruth 7/17/2014
仅供参考:如果同一资源有多个路径,这将不起作用。
0赞 Dorian 8/28/2021
对于我从处理“未找到”的页面中获取的路径,工作正常/activities/:id404?id=:idurl_for(only_path: false)request.original_url
29赞 Dorian 10/29/2011 #11

我需要应用程序 URL,但需要子目录。我用了:

root_url(:only_path => false)
28赞 Yuri Barbashov 4/12/2012 #12
 url_for(params)

您可以轻松添加一些新参数:

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

评论

5赞 Olivier Lacan 11/8/2012
这比批准的答案要优雅得多(如果不那么精细)。
12赞 Tim Santeford 4/14/2012 #13

这适用于 Ruby on Rails 3.0,并且应该被大多数版本的 Ruby on Rails 支持:

request.env['REQUEST_URI']
8赞 msroot 5/11/2012 #14
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
12赞 Frans 6/19/2012 #15

可悲的是,线程中的任何建议都没有帮助我,除了有人说他使用调试器来查找他寻找的内容。

我创建了一些自定义错误页面,而不是标准的 404 和 500,但以而不是预期的 .request.url/404/non-existing-mumbo-jumbo

我需要使用的是

request.original_url
13赞 Sergiy Seletskyy 8/10/2012 #16

使用 Ruby 1.9.3-p194 和 Ruby on Rails 3.2.6:

如果request.fullpath对你不起作用,试试request.env[“HTTP_REFERER”]

以下是我的故事。

我在检测累积页面的当前 URL(显示在她的浏览器中的用户地址栏中)时遇到了类似的问题,该页面结合了来自不同控制器的信息,例如,.http://localhost:3002/users/1/history/issues

用户可以切换到不同的问题类型列表。所有这些列表都是通过 Ajax 从不同的控制器/部件加载的(无需重新加载)。

问题在于在列表的每个项目中为后退按钮设置正确的路径,以便后退按钮可以在其自己的页面和累积页面历史记录中正常工作。

如果我使用 request.fullpath,它会返回最后一个 JavaScript 请求的路径,这绝对不是我要找的 URL。

所以我使用了request.env[“HTTP_REFERER”],它存储了上次重新加载的请求的URL。

以下是部分部分的摘录,以做出决定

- 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

评论

0赞 Spencer Rathbun 8/10/2012
是的,fullpath 为您提供您请求的 url,而不是您来自的 url,这也是我所需要的。谢谢你!
2赞 DDDD 4/8/2014
效果很好,正是我需要的。不过,这应该在单独的问答中。在这里很难找到。:/
0赞 Ahmad hamza 12/12/2012 #17

获取绝对 URL,这意味着它可以像这样显示from the root

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

users_url帮助程序生成一个包含协议和主机的 URL 名字。users_path帮助程序仅生成路径部分。

users_url: http://localhost/users
users_path: /users
3赞 Victor S 1/2/2013 #18

如果你想具体一点,意思是,你知道你需要的路径:

link_to current_path(@resource, :only_path => false), current_path(@resource)
6赞 mikrobi 3/13/2013 #19

在 Rails 3 中,你可以使用

request.original_url

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

67赞 Mike 7/2/2013 #20

如果您使用的是 Rails 3.2Rails 4,则应使用来获取当前 URL。request.original_url


该方法的文档已 http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url,但如果您好奇,其实现是:

def original_url
  base_url + original_fullpath
end

编辑Rails 7Docs)仍然如此。

9赞 Idan Wender 7/21/2013 #21

您可以使用 ruby 方法:

:root_url

这将获取带有基本 URL 的完整路径:

localhost:3000/bla

评论

0赞 Kris Khaira 12/10/2014
这是在 Rails 4 中使用 active_model_serializers 的序列化程序中唯一有效的解决方案。
0赞 boddhisattva 2/28/2017
你能告诉我,当我使用somethin like来获取绝对url时,我如何限制我传递给绝对url的参数?假设我是 usin somethin like 并被定义为 'def some_method(route, opts = {}) end ' 我不希望我的路由看起来像 - 。我希望路线看起来像.我只想成为 opts 哈希的一部分,而不是作为绝对 url 的参数。:root_urlsome_method(:products_brand_url, brand: brand, entity_name: "brand")some_methodhttp://localhost:3000/brands/brand_name?&entity_name="brand"http://localhost:3000/brands/brand_nameentity_name
0赞 smileart 5/18/2019
当然,没有 Ruby 方法称为 。root_url
3赞 Pankhuri 8/10/2013 #22

对于 rails 3 :

请求.fullpath

3赞 Satishakumar Awati 3/3/2014 #23
request.env["REQUEST_URI"]

适用于 Rails 2.3.4 测试,不知道其他版本。

6赞 uma 3/11/2014 #24

你可以在 Rails 3.2 中使用任何一个:

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

我认为它会在任何地方都有效

"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
-2赞 user3355933 3/19/2014 #25

您可以通过调用以下命令来获取绝对 URL:

request.original_url

request.env['HTTP_REFERER']
6赞 Arvind singh 3/26/2015 #26

Rails 4.0 (英语)

您可以使用 ,输出将如下例所示request.original_url

get "/articles?page=2"

request.original_url # => "http://www.example.com/articles?page=2"
3赞 Nerve 4/9/2015 #27

获取不带任何查询参数的请求 URL。

def current_url_without_parameters
  request.base_url + request.path
end
0赞 user3118220 4/17/2015 #28

轨道 4

控制器:

def absolute_url
  request.base_url + request.original_fullpath
end

Action Mailer 4.2 版本中的重要更改:

link_to 和 url_for 在模板中默认生成绝对 URL,则不再需要传递 only_path: false。(提交)

视图:

如果使用后缀,则生成的 URL 是绝对的。用于获取相对 URL。_url_path

<%= link_to "Home", root_url %>

有关更多详细信息,请访问:

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

评论

1赞 ctc 4/22/2015
不需要自定义方法。正确答案在上面。
1赞 Ali Hassan Mirza 8/18/2015 #29

您可以使用:

request.full_path

request.url

希望它能解决您的问题。

干杯

5赞 Robin Garg 12/2/2015 #30

您可以使用

request.original_url 

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

获取当前 URL。

3赞 RaK427 3/5/2016 #31

您可以将变量设置为 ,我还没有在这里看到这个建议,它对我有用。URI.parse(current_url)

5赞 Amit 5/26/2016 #32

对于 Rails 3.2 或 Rails 4只需以这种方式“request.original_url” 参考:原始 URL 方法

对于 Rails 3由于 request.url 已弃用。我们可以通过连接来获得绝对路径

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

对于 Rails 2

request.url
0赞 V K Singh 1/22/2018 #33

对于 Rails 3.x 及更高版本:

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

对于 Rails 3.2 及更高版本:

request.original_url

因为在 rails 3.2 及更高版本中:

request.original_url = request.base_url + request.original_fullpath

欲了解更多信息,请访问 http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url