如何在我的 Ruby on Rails 视图中获取当前绝对 URL?
request.request_uri
仅返回 相对 URL。
对于 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 给你完整的地址。
我认为 Ruby on Rails 3.0 方法现在是 request.fullpath
。
您可以使用 url_for(only_path: false)
url_for(only_path: false)
时我得到 404?id=:id
的 /activities/:id
路径,request.original_url
工作正常
弃用警告:Using #request_uri is deprecated。请改用完整路径。
request.uri
时,这条线直接来自日志,并且在这个问题中已经多次指出这一点,但是......好的,谢谢
如果您使用的是 Rails 3.2 或 Rails 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) 仍然是这种情况。
您可以在 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
url_for params.merge(:format => "PDF", :only_path => false)
link_to
中,您可以只使用 params.merge
并完全跳过 url_for
对于 Ruby on Rails 3:
request.url
request.host_with_port
我启动了一个调试器会话并查询了请求对象:
request.public_methods
在 Ruby on Rails 3.1.0.rc4 中:
request.fullpath
fullpath
没有按照原始发帖人的要求提供 absolute URL
。
url_for(params)
您可以轻松添加一些新参数:
url_for(params.merge(:tag => "lol"))
我认为 request.domain 会起作用,但是如果您位于 blah.blah.com 之类的子目录中怎么办?像这样的东西可以工作:
<%= request.env["HTTP_HOST"] + page = "/" + request.path_parameters['controller'] + "/" + request.path_parameters['action'] %>
根据您的路径结构更改参数。
希望有帮助!
看起来 request_uri
在 Ruby on Rails 3 中已被弃用。
Using #request_uri is deprecated. Use fullpath instead.
使用 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
这适用于 Ruby on Rails 3.0,并且大多数版本的 Ruby on Rails 都应该支持:
request.env['REQUEST_URI']
可悲的是,线程中的任何建议都没有帮助我,除了有人说他使用调试器来查找他要查找的内容。
我创建了一些自定义错误页面,而不是标准的 404 和 500,但 request.url
以 /404
结尾,而不是预期的 /non-existing-mumbo-jumbo
。
我需要使用的是
request.original_url
如果通过相对,您的意思是没有域,然后查看 request.domain
。
您可以使用红宝石方法:
:root_url
这将获得带有基本 url 的完整路径:
localhost:3000/bla
: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_url
的 Ruby 方法。
(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)
在 Rails 3 中,您可以使用
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
您可以将任何一种用于 rails 3.2:
request.original_url
or
request.env["HTTP_REFERER"]
or
request.env['REQUEST_URI']
我认为它会在任何地方工作
"#{request.protocol}#{request.host}:#{request.port}#{request.fullpath}"
导轨 4.0
您可以使用 request.original_url
,输出将如下例所示
get "/articles?page=2"
request.original_url # => "http://www.example.com/articles?page=2"
您可以使用
request.original_url
或者
"#{request.protocol}#{request.host_with_port}"
获取当前 URL。
对于 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
如果你想具体一点,意思是,你知道你需要的路径:
link_to current_path(@resource, :only_path => false), current_path(@resource)
对于导轨 3:
request.fullpath
request.env["REQUEST_URI"]
在经过测试的 rails 2.3.4 中工作,不知道其他版本。
获取不带任何查询参数的请求 URL。
def current_url_without_parameters
request.base_url + request.path
end
您可以将变量设置为 URI.parse(current_url)
,我在这里还没有看到这个建议,它对我有用。
您可以使用:
request.full_path
或者
request.url
希望它能解决您的问题。
干杯
要获取绝对 URL,这意味着 from the root
它可以像这样显示
<%= link_to 'Edit', edit_user_url(user) %>
users_url 帮助器生成一个包含协议和主机名的 URL。 users_path 助手只生成路径部分。
users_url: http://localhost/users
users_path: /users
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/…)