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

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

request.request_uri只返回相对 URL。

547186 次浏览

如果你说的相对是指没有领域,那么就看看request.domain

适用于Rails 3.2或Rails 4+

您应该使用request.original_url来获取当前URL。源代码当前回购发现在这里

这个方法被记录在original_url方法,但如果你好奇,它的实现是:

def original_urlbase_url + original_fullpathend

对于Rails 3:

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


对于Rails 2:

你可以写request.url而不是request.request_uri。这结合了协议(通常是主机的http://)和提供完整地址的request_uri)。

我认为请求。域名可以,但如果你在像blah.blah.com这样的子目录中呢?这样做是可行的:

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

根据路径结构更改参数。

希望有帮助!

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

# https://x.com/y/1?page=1# + current_url( :page => 3 )# = https://x.com/y/1?page=3def current_url(overwrite={})url_for :only_path => false, :params => params.merge(overwrite)end

使用示例:

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

弃用警告:不建议使用#request_uri。请改用fullpath。

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

看起来request_uri在Ruby on Rails 3中已弃用。

Using #request_uri is deprecated. Use fullpath instead.

在Ruby on Rails 3.1.0.rc4中:

 request.fullpath

对于Ruby on Rails 3:

request.urlrequest.host_with_port

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

request.public_methods

你可以使用url_for(only_path: false)

我需要应用程序URL,但带有子目录。我使用:

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

你可以很容易地添加一些新参数:

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

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

request.env['REQUEST_URI']
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)

遗憾的是,这篇文章中的建议没有一个对我有帮助,除了有人说他使用调试器来找到他要找的东西。

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

我需要用的是

request.original_url

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

如果0对你不起作用,试试1

下面是我的故事。

我在检测当前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

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

<%= link_to 'Edit', edit_user_url(user) %>
users_url helper生成一个包含协议和主机的URL的名字。users_path helper只生成路径部分
users_url: http://localhost/usersusers_path: /users

如果你想要更具体,也就是说,你知道你需要的路径:

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

在Rails 3中你可以使用

request.original_url

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

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


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

def original_urlbase_url + original_fullpathend

编辑:对于Rails 7(文档)来说也是如此。

你可以使用ruby方法:

:root_url

它将获得包含base url的完整路径:

localhost:3000/bla

对于rails 3:

request.fullpath

request.env["REQUEST_URI"]

工作在rails 2.3.4测试,不知道其他版本。

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

request.original_urlorrequest.env["HTTP_REFERER"]orrequest.env['REQUEST_URI']

我认为它在任何地方都适用

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

你可以通过调用:

request.original_url

request.env['HTTP_REFERER']

Rails 4.0

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

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

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

def current_url_without_parametersrequest.base_url + request.pathend

Rails 4

控制器:

def absolute_urlrequest.base_url + request.original_fullpathend

Action Mailer 4.2 release:

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

观点:

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

<%= link_to "Home", root_url %>

欲知详情,请浏览:

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

你可以使用:

request.full_path

request.url

希望它能解决你的问题。

干杯

你可以用

request.original_url

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

获取当前URL。

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

适用于Rails 3.2或Rails 4通过这种方式获取request。original_url参考:# 0 < / p >

For Rails 3请求。Url已弃用。我们可以通过连接

来获得绝对路径
"#{request.protocol}#{request.host_with_port}#{request.fullpath}"

For Rails 2

request.url

对于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