ChatGPT解决这个技术问题 Extra ChatGPT

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

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

request.request_uri 仅返回 相对 URL。


1
15 revs, 15 users 33%

对于 Rails 3.2 或 Rails 4+

您应该使用 request.original_url 来获取当前 URL。当前存储库上的源代码已找到 here

此方法记录在 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 给你完整的地址。


正如其他用户指出的那样:弃用警告:不推荐使用#request_uri。改用完整路径
@giladbu fullpath 不包括协议/域/端口!这不是一个绝对的网址!
"http://#{request.host+request.fullpath}" 将起作用或以其他方式工作,(如果端口很重要)"http://#{request.host}:#{request.port+request.fullpath}"
如果端口很重要,这个可以正常工作:"http://#{request.host}:#{request.port}#{request.fullpath}"
您能否指出不推荐使用 request.url 的声明的参考?建议的解决方案只是说明 request.url 已经做了什么;实现只是协议 + host_with_port + fullpath (github.com/rails/rails/blob/…)
P
Peter Mortensen

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


完整路径不包括域
我很高兴提供了这一点,因为我实际上是在寻找如何不包含该域。
g
grzuy

您可以使用 url_for(only_path: false)


在我的(有点特殊的情况下)这几乎正是我想要的。我只是将选项更改为 true 并获得了当前页面的 url,没有选项。谢谢 :)
@David 不在视图中。但无论如何都不应该在那里使用它=)
就我而言,我想更改主机名但保留其他所有内容。我发现 url_for(host: 'www.newdomain.com') 最适合我作为解决问题的方法。 IMO,它是一个更强大的解决方案,因为它在所有版本的导轨中都是相同的。
仅供参考,如果同一资源有多个路径,这将不起作用。
对于从处理“未找到”的页面执行 url_for(only_path: false) 时我得到 404?id=:id/activities/:id 路径,request.original_url 工作正常
l
lulalala

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


请参阅答案 stackoverflow.com/a/2165727/166279 的注释,完整路径不包括域。
在撰写本文时,使用 request.uri 时,这条线直接来自日志,并且在这个问题中已经多次指出这一点,但是......好的,谢谢
@ManishShrivastava:有趣,尽管我付出了所有“原创”努力来回答更复杂的问题,但这个复制和粘贴给了我最高分,嗯......总比没有好
d
dsomel21

如果您使用的是 Rails 3.2Rails 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

编辑Rails 7 (Docs) 仍然是这种情况。


C
Charles

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

这似乎没有在 Rails 3.1 中定义。
你可以这样做url_for params.merge(:format => "PDF", :only_path => false)
此外,如果您在 link_to 中,您可以只使用 params.merge 并完全跳过 url_for
P
Peter Mortensen

对于 Ruby on Rails 3:

request.url
request.host_with_port

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

request.public_methods

P
Peter Mortensen

在 Ruby on Rails 3.1.0.rc4 中:

 request.fullpath

fullpath 没有按照原始发帖人的要求提供 absolute URL
P
Peter Mortensen

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

root_url(:only_path => false)

P
Peter Mortensen
 url_for(params)

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

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

这比批准的答案要优雅得多(如果不那么细化)。
J
James M

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

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

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

希望有帮助!


是的,Jaime 的回答要好得多,但如果你想变得非常低效,你可以按照我的方式去做。
P
Peter Mortensen

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

Using #request_uri is deprecated. Use fullpath instead.

P
Peter Mortensen

使用 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

是的,fullpath 为您提供您请求的 url,而不是您来自的 url,这也是我需要的。谢谢你!
效果很好,正是我需要的。不过,这应该是一个单独的问题和答案。这里有点难找。 :/
P
Peter Mortensen

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

request.env['REQUEST_URI']

F
Frans

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

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

我需要使用的是

request.original_url

P
Peter Mortensen

如果通过相对,您的意思是没有域,然后查看 request.domain


J
Jai Chauhan

您可以使用红宝石方法:

:root_url

这将获得带有基本 url 的完整路径:

localhost:3000/bla

这是在 Rails 4 中使用 active_model_serializers 的序列化器中唯一有效的解决方案。
你能告诉我当我使用像 :root_url 这样的东西来获取绝对 url 时,如何限制我传递给绝对 url 的参数?假设我正在使用类似 some_method(:products_brand_url, brand: brand, entity_name: "brand") 的东西,并且 some_method 被定义为`def some_method(route, opts = {}) end`我不希望我的路线看起来像 - http://localhost:3000/brands/brand_name?&entity_name="brand"。我希望路线看起来像 http://localhost:3000/brands/brand_name。我只希望 entity_name 成为 opts 哈希的一部分,而不是作为绝对 url 的参数。
当然没有称为 root_urlRuby 方法。
m
msroot
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)

m
mikrobi

在 Rails 3 中,您可以使用

request.original_url

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


u
uma

您可以将任何一种用于 rails 3.2:

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

我认为它会在任何地方工作

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

A
Arvind singh

导轨 4.0

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

get "/articles?page=2"

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

R
Robin Garg

您可以使用

request.original_url 

或者

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

获取当前 URL。


N
Noor Ali Khan

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

V
Victor S

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

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

P
Pankhuri

对于导轨 3:

request.fullpath


S
Satishakumar Awati
request.env["REQUEST_URI"]

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


N
Nerve

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

def current_url_without_parameters
  request.base_url + request.path
end

A
Artem Mostyaev

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


A
Ali Hassan Mirza

您可以使用:

request.full_path

或者

request.url

希望它能解决您的问题。

干杯


A
Ahmad hamza

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

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

users_url 帮助器生成一个包含协议和主机名的 URL。 users_path 助手只生成路径部分。

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