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

我怎样才能在我的Ruby on Rails视图中获取当前的绝对URL

request.request_uri只返回相对的URL。

对于Rails 3.2或Rails 4+

你应该使用request.original_url获取当前的URL。

original_url方法logging了这个方法,但是如果你好奇,实现是:

 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)

弃权警告: 不推荐使用#request_uri 。 改为使用完整path。

如果您使用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 

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

对于Ruby on Rails 3:

 request.url request.host_with_port 

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

 request.public_methods 

在Ruby on Rails 3.1.0.rc4中:

  request.fullpath 

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

 root_url(:only_path => false) 
  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'] %> 

根据您的path结构更改参数。

希望有所帮助!

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

 Using #request_uri is deprecated. Use fullpath instead. 

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

 request.env['REQUEST_URI'] 

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

如果request.fullpath不起作用,请尝试request.env [“HTTP_REFERER”]

下面是我的故事。

对于结合来自不同控制器的信息(例如, http://localhost:3002/users/1/history/issues )的累积页面,检测到当前URL(显示在浏览器中的用户的地址栏中)中也遇到了类似的问题。

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

问题是在列表中的每个项目中为后退button设置正确的path,所以后退button可以在其自己的页面和累积页面历史logging中正常工作

在我使用request.fullpath的情况下,它返回最后一个JavaScript请求的path,这绝对不是我正在寻找的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 

在线程中没有任何build议可悲地帮助我,除了有人说他使用debugging器来find他所期待的。

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

我需要使用的是

 request.original_url 

如果通过亲戚,你的意思是没有域,然后看看request.domain

你可以使用ruby方法:

 :root_url 

这将得到完整的path:localhost:3000 / bla

 (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 4.0

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

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

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

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

对于导轨3:

request.fullpath

 request.env["REQUEST_URI"] 

在rails 2.3.4中testing过,不知道其他版本。

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

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

我认为它会在每个地方工作

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

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

 def current_url_without_parameters request.base_url + request.path end 

您可以使用:

 request.full_path 

要么

 request.url 

希望它能解决你的问题。

干杯

你可以使用

 request.original_url 

要么

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

获取当前的url

为了得到绝对URL,这意味着from the root可以像这样显示

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

users_url助手会生成一个包含协议和主机名的URL。 users_path帮助程序只生成path部分。

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

Rails 4

控制器:

 def absolute_url request.base_url + request.original_fullpath end 

行动梅勒4.2版本中的显着变化:

link_to和url_for默认在模板中生成绝对URL,不再需要传递only_path:false。 (承诺)

视图:

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

 <%= link_to "Home", root_url %> 

有关更多详细信息,请转到:

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

你可以设置一个variables为URI.parse(current_url) ,我没有在这里看到这个提议,它适用于我。