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

Jakub Arnold 980 ruby url ruby-on-rails

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

request.request_uri只返回相对URL.

Jaime Bellmy.. 1366

对于Rails 3.2或Rails 4+

您应该使用request.original_url获取当前URL.

这个方法记录在original_url方法中,但是如果你很好奇,那么实现是:

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则为您提供完整的地址.

  • `"http://#{request.host + request.fullpath}"`将起作用或以其他方式,(如果端口很重要)`"http://#{request.host}:#{request.port + request .fullpath}"` (36认同)
  • 正如其他用户所指出的:弃用警告:不推荐使用#request_uri.请改用完整路径 (30认同)
  • @giladbu`completepath`不包含协议/域/端口!这不是一个绝对的URL! (9认同)
  • request.url在rails 3.0.3上为我工作 (9认同)
  • 如果端口重要,这个工作正常:`"http://#{request.host}:#{request.port}#{request.fullpath}"` (7认同)
  • 您是否可以指出"request.url"已被弃用的声明?建议的解决方案只是很长一段时间来说'request.url`已经做了什么; 实现只是protocol + host_with_port + fullpath(https://github.com/rails/rails/blob/33841a9db3e560ef062d36d14ea07f7d71dd65ab/actionpack/lib/action_dispatch/http/url.rb#L86) (3认同)

mcr.. 130

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

  • fullpath不包括域 (12认同)

grzuy.. 114

你可以用 url_for(:only_path => false)

  • 只使用url_for(没有参数)也可以. (5认同)

ecoologic.. 67

弃用警告:不推荐使用#request_uri.请改用完整路径.

  • 请参阅答案http://stackoverflow.com/a/2165727/166279上的注释,完整路径不包括域. (4认同)

Mike.. 58

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

  • 重复的答案. (5认同)

grosser.. 50

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

  • 如果你在`link_to`你也可以使用`params.merge`并完全跳过`url_for` (2认同)

Duke.. 35

对于Ruby on Rails 3:

request.url
request.host_with_port

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

request.public_methods


Lucas Renan.. 31

在Ruby on Rails 3.1.0.rc4中:

 request.fullpath

  • `fullpath`不提供'绝对URL'作为原始海报请求. (5认同)

Dorian.. 28

我需要应用程序URL但是需要子目录.我用了:

root_url(:only_path => false)


Yuri Barbas.. 27

 url_for(params)

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

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

  • 这比批准的答案更优雅(如果不那么精细). (5认同)

James M.. 15

我认为request.domain可以工作,但是如果你在像blah.blah.com这样的子目录中呢?像这样的东西可以工作:

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

根据路径结构更改参数.

希望有所帮助!

  • 是的,Jaime的答案更好,但如果你想要真正低效,你可以按我的方式去做. (8认同)

Ken Earley.. 14

它似乎request_uri在Ruby on Rails 3中被弃用了.

Using #request_uri is deprecated. Use fullpath instead.


Serge Selets.. 13

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

  • 工作得很好,正是我需要的.这应该是一个单独的问题和答案.有点难以找到这里.:/ (2认同)

Tim Santefor.. 12

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

request.env['REQUEST_URI']


Frans.. 11

线程中的所有建议都没有让我伤心,除了有人说他使用调试器找到他所寻找的东西.

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

我需要使用的是

request.original_url


ghoppe.. 9

如果是亲戚,你的意思是没有域名,那么请查看request.domain.


Idan Wender.. 9

你可以使用ruby方法:

:root_url

这将获得基本网址的完整路径:

localhost:3000/bla


用户甲.. 8

(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)


mikrobi.. 6

在Rails 3中,您可以使用

request.original_url

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


用户甲.. 5

Rails 4.0

你可以使用request.original_url,输出将如下面给出的例子

get "/articles?page=2"

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


提问时间:

查看次数:

444356 次

最近活跃:

1 年 前