如何在Ruby on Rails视图中获取当前的绝对URL?
该request.request_uri
只返回相对URL。
如何在Ruby on Rails视图中获取当前的绝对URL?
该request.request_uri
只返回相对URL。
Answers:
您应该使用request.original_url
获取当前URL。
该方法记录在original_url方法中,但是如果您很好奇,则实现为:
def original_url
base_url + original_fullpath
end
您可以编写"#{request.protocol}#{request.host_with_port}#{request.fullpath}"
,因为request.url
现在已弃用。
您可以写request.url
而不是request.request_uri
。这将协议(通常为http://)与主机以及request_uri结合在一起,以提供完整的地址。
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/…)
你可以用 url_for(only_path: false)
弃用警告:不建议使用#request_uri。请改用fullpath。
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
您可以在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
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'] %>
根据您的路径结构更改参数。
希望有帮助!
使用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方法:
: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
。
在Rails 3中,您可以使用
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
request.env["REQUEST_URI"]
可以在Rails 2.3.4上进行测试,并且不了解其他版本。