如何获取RubyonRails中的当前绝对URL?

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

如何在RubyonRails视图中获取当前的绝对URL?

request.request_uri只返回相对URL。


对于轨道3.2或轨道4+

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

这个方法是在原始的URL方法中记录的,但是如果您好奇的话,实现是:

1
2
3
def original_url
  base_url + original_fullpath
end

轨道3:

您可以编写"#{request.protocol}#{request.host_with_port}#{request.fullpath}",因为request.url现在已被弃用。

轨道2:

你可以写request.url,而不是request.request_uri。这将协议(通常是http://)与主机结合在一起,并请求_uri提供完整地址。


我认为RubyonRails3.0方法现在是request.fullpath


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


拒绝警告:不推荐使用请求URI。改为使用完整路径。


如果您使用的是Rails 3.2或Rails 4,那么应该使用request.original_url获取当前的URL。

该方法的文档位于http://api.rubyonrails.org/classes/actiondispatch/request.html method-i-original_url,但如果您对该方法感兴趣,则实现为:

1
2
3
def original_url
  base_url + original_fullpath
end


您可以在ApplicationController中添加此当前的URL方法以返回当前的URL并允许合并其他参数。

1
2
3
4
5
6
# 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

示例用法:

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


对于Ruby on Rails 3:

1
2
request.url
request.host_with_port

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

1
request.public_methods

在Ruby on Rails 3.1.0.rc4中:

1
 request.fullpath


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

1
root_url(:only_path => false)


1
 url_for(params)

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

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


我认为request.domain可以工作,但是如果你在blah.blah.com这样的子目录中呢?类似这样的事情可能会奏效:

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

根据路径结构更改参数。

希望有帮助!


看起来request_uri在RubyonRails3中被弃用了。

1
Using #request_uri is deprecated. Use fullpath instead.

使用Ruby1.9.3-p194和RubyonRails 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。

这是部分的一个节选来做决定

1
2
3
4
5
6
- 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


这适用于RubyonRails3.0,并且应该得到大多数RubyonRails版本的支持:

1
request.env['REQUEST_URI']


线程中的所有建议都没有给我带来可悲的帮助,除了有人说他使用调试程序来查找所需内容的建议。

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

我需要使用的是

1
request.original_url

您可以使用Ruby方法:

1
:root_url

它将获得基本URL的完整路径:

1
localhost:3000/bla


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


1
(url_for(:only_path => false) =="/" )? root_url : url_for(:only_path => false)

在Rails 3中,您可以使用

1
request.original_url

http://apidock.com/rails/v3.2.8/actionspatch/request/original_url


钢轨4

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

1
2
3
get"/articles?page=2"

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

如果你想明确,意思是,你知道你需要的路径:

1
link_to current_path(@resource, :only_path => false), current_path(@resource)

轨道3:

request.fullpath


您可以对Rails 3.2使用任何一个:

1
2
3
4
5
request.original_url
or
request.env["HTTP_REFERER"]
or
request.env['REQUEST_URI']

我想在任何地方都能用

1
"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"

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

1
2
3
def current_url_without_parameters
  request.base_url + request.path
end


你也可以用

1
request.original_url

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

获取当前URL。


对于轨道3.2或轨道4以这种方式获取"request.originalu url"参考:原始URL方法

铁路3不推荐使用as request.url。我们可以通过连接

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

铁路2

1
request.url

1
request.env["REQUEST_URI"]

在经过测试的Rails 2.3.4中工作,不了解其他版本。


你可以使用:

1
request.full_path

1
request.url

希望它能解决你的问题。

干杯


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


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

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

对于轨道3.2及以上:

1
request.original_url

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

1
request.original_url = request.base_url + request.original_fullpath

有关更多信息,请访问http://api.rubyonrails.org/classes/actiondispatch/request.html method-i-original_url


钢轨4

控制器:

1
2
3
def absolute_url
  request.base_url + request.original_fullpath
end

action mailer 4.2版本中的显著变化:

链接到和url,默认情况下在模板中生成绝对URL,不再只需要传递路径:false。(提交)

观点:

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

1
<%= link_to"Home", root_url %>

有关详细信息,请访问:

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


要获得绝对URL,这意味着from the root可以这样显示

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

用户的URL助手生成一个包含协议和主机的URL姓名。用户的路径助手只生成路径部分。

1
2
users_url: http://localhost/users
users_path: /users

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

1
request.original_url

1
request.env['HTTP_REFERER']