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

时间:2010-01-29 22:32:45

标签: ruby-on-rails ruby url

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

request.request_uri仅返回相对网址。

33 个答案:

答案 0 :(得分:1381)

对于Rails 3.2或Rails 4 +

您应该使用request.original_url来获取当前网址。

这个方法记录在original_url method,但是如果你很好奇,那么实现是:

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则为您提供完整的地址。

答案 1 :(得分:131)

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

答案 2 :(得分:115)

您可以使用url_for(:only_path => false)

答案 3 :(得分:67)

弃权警告:Using #request_uri is deprecated。请改用完整路径。

答案 4 :(得分:58)

如果您使用 Rails 3.2 Rails 4 ,则应使用request.original_url获取当前网址。


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

def original_url
  base_url + original_fullpath
end

答案 5 :(得分:50)

您可以在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

答案 6 :(得分:35)

Ruby on Rails 3:

request.url
request.host_with_port

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

request.public_methods

答案 7 :(得分:31)

在Ruby on Rails 3.1.0.rc4中:

 request.fullpath

答案 8 :(得分:28)

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

root_url(:only_path => false)

答案 9 :(得分:27)

 url_for(params)

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

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

答案 10 :(得分:16)

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

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

根据您的路径结构更改参数。

希望有所帮助!

答案 11 :(得分:14)

看起来在Ruby on Rails 3中不推荐使用request_uri

Using #request_uri is deprecated. Use fullpath instead.

答案 12 :(得分:13)

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

如果 request.fullpath 不适合您,请尝试 request.env [“HTTP_REFERER”]

以下是我的故事。

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

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

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

如果我使用 request.fullpath ,它会返回上一次JavaScript请求的路径,这绝对不是我正在寻找的网址。

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

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

- 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

答案 13 :(得分:12)

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

request.env['REQUEST_URI']

答案 14 :(得分:11)

线程中的所有建议都没有让我伤心,除了有人说他用调试器找到他想要的东西。

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

我需要使用的是

request.original_url

答案 15 :(得分:9)

如果是亲戚,则表示没有域名,请查看request.domain

答案 16 :(得分:8)

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

答案 17 :(得分:8)

您可以使用ruby方法:

:root_url

将获得基本网址的完整路径:

localhost:3000/bla

答案 18 :(得分:6)

在Rails 3中,您可以使用

request.original_url

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

答案 19 :(得分:6)

Rails 4.0

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

get "/articles?page=2"

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

答案 20 :(得分:4)

对于Rails 3.2或Rails 4 只需这样“request.original_url” 参考:Original URL Method

对于Rails 3 因为request.url已被弃用。我们可以通过连接

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

对于Rails 2

request.url

答案 21 :(得分:3)

您可以使用

request.original_url 

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

获取当前网址。

答案 22 :(得分:3)

获取没有任何查询参数的请求URL。

def current_url_without_parameters
  request.base_url + request.path
end

答案 23 :(得分:3)

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

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

我认为它可以在任何地方工作

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

答案 24 :(得分:3)

对于rails 3:

  

request.fullpath

答案 25 :(得分:3)

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

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

答案 26 :(得分:2)

request.env["REQUEST_URI"]

在rails 2.3.4中测试过,并且不了解其他版本。

答案 27 :(得分:1)

您可以将变量设置为URI.parse(current_url),我现在还没有看到此提案,这对我有用。

答案 28 :(得分:1)

您可以使用:

request.full_path

request.url

希望它能解决您的问题。

干杯

答案 29 :(得分:0)

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

答案 30 :(得分:0)

Rails 4

控制器:

def absolute_url
  request.base_url + request.original_fullpath
end

动作邮件程序4.2 release中的显着变化:

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

查看:

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

<%= link_to "Home", root_url %>

有关详细信息,请转到:

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

答案 31 :(得分:0)

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

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

users_url帮助程序生成包含协议和主机的URL 名称。 users_path助手只生成路径部分。

users_url: http://localhost/users
users_path: /users

答案 32 :(得分:-2)

你可以通过以下方式获得绝对网址:

request.original_url

request.env['HTTP_REFERER']