如何在Ruby on Rails视图中获得当前绝对 URL ?
request.request_uri只返回相对 URL。
request.request_uri
如果你说的相对是指没有领域,那么就看看request.domain。
request.domain
您应该使用request.original_url来获取当前URL。源代码当前回购发现在这里。
request.original_url
这个方法被记录在original_url方法,但如果你好奇,它的实现是:
def original_urlbase_url + original_fullpathend
您可以编写"#{request.protocol}#{request.host_with_port}#{request.fullpath}",因为request.url现在已弃用。
"#{request.protocol}#{request.host_with_port}#{request.fullpath}"
request.url
你可以写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.fullpath
看起来request_uri在Ruby on Rails 3中已弃用。
request_uri
Using #request_uri is deprecated. Use fullpath instead.
在Ruby on Rails 3.1.0.rc4中:
对于Ruby on Rails 3:
request.urlrequest.host_with_port
我启动了一个调试器会话并查询了请求对象:
request.public_methods
你可以使用url_for(only_path: false)
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。
/404
/non-existing-mumbo-jumbo
我需要用的是
使用Ruby 1.9.3-p194和Ruby on Rails 3.2.6:
如果0对你不起作用,试试1
下面是我的故事。
我在检测当前URL(显示在用户浏览器的地址栏中)时遇到了类似的问题,这些累积页面组合了来自不同控制器的信息,例如http://localhost:3002/users/1/history/issues。
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可以像这样显示
from the root
<%= link_to 'Edit', edit_user_url(user) %>
users_url: http://localhost/usersusers_path: /users
如果你想要更具体,也就是说,你知道你需要的路径:
link_to current_path(@resource, :only_path => false), current_path(@resource)
在Rails 3中你可以使用
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
如果您使用Rails 3.2或Rails 4,您应该使用request.original_url来获取当前URL。
该方法的文档位于http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url,但如果你好奇,它的实现是:
编辑:对于Rails 7(文档)来说也是如此。
你可以使用ruby方法:
:root_url
它将获得包含base url的完整路径:
localhost:3000/bla
对于rails 3:
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.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。
_url
_path
<%= link_to "Home", root_url %>
欲知详情,请浏览:
http://blog.grepruby.com/2015/04/absolute-url-full-url-in-rails-4.html
你可以使用:
request.full_path
希望它能解决你的问题。
干杯
你可以用
"#{request.protocol}#{request.host_with_port}"
获取当前URL。
你可以设置一个变量为URI.parse(current_url),我在这里还没有看到这个建议,它为我工作。
URI.parse(current_url)
适用于Rails 3.2或Rails 4通过这种方式获取request。original_url参考:# 0 < / p >
For Rails 3请求。Url已弃用。我们可以通过连接
For Rails 2
对于Rails 3。X向上:
#{request.protocol}#{request.host_with_port}#{request.fullpath}
对于Rails 3.2及更高版本:
因为在rails 3.2及更高版本中:
request.original_url = request.base_url + request.original_fullpath
更多信息,请访问http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url