提问人:Jakub Arnold 提问时间:1/30/2010 最后编辑:Aryan BeezadhurJakub Arnold 更新时间:8/20/2023 访问量:565593
如何在 Ruby on Rails 中获取当前的绝对 URL?
How do I get the current absolute URL in Ruby on Rails?
答:
如果相对,你的意思是没有域,那么看看.request.domain
适用于 Rails 3.2 或 Rails 4+
您应该使用来获取当前 URL。当前 repo 的源代码可在此处找到。request.original_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:
您可以编写 .这将协议(通常为 http://)与主机相结合,并request_uri为您提供完整的地址。request.url
request.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
)
我认为request.domain会起作用,但是如果您在像 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=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
弃用警告:不推荐使用 #request_uri。请改用完整路径。
评论
request.uri
我认为 Ruby on Rails 3.0 方法现在是.request.fullpath
评论
它似乎在 Ruby on Rails 3 中被弃用了。request_uri
Using #request_uri is deprecated. Use fullpath instead.
在 Ruby on Rails 3.1.0.rc4 中:
request.fullpath
评论
fullpath
未提供原始海报要求的。absolute URL
对于 Ruby on Rails 3:
request.url
request.host_with_port
我启动了一个调试器会话并查询了请求对象:
request.public_methods
你可以使用url_for(only_path: false)
评论
/activities/:id
404?id=:id
url_for(only_path: false)
request.original_url
我需要应用程序 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
我需要使用的是
request.original_url
使用 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
评论
获取绝对 URL,这意味着它可以像这样显示from the root
<%= link_to 'Edit', edit_user_url(user) %>
users_url帮助程序生成一个包含协议和主机的 URL 名字。users_path帮助程序仅生成路径部分。
users_url: http://localhost/users
users_path: /users
如果你想具体一点,意思是,你知道你需要的路径:
link_to current_path(@resource, :only_path => false), current_path(@resource)
在 Rails 3 中,你可以使用
request.original_url
http://apidock.com/rails/v3.2.8/ActionDispatch/Request/original_url
如果您使用的是 Rails 3.2 或 Rails 4,则应使用来获取当前 URL。request.original_url
该方法的文档已 http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url,但如果您好奇,其实现是:
def original_url
base_url + original_fullpath
end
编辑:Rails 7(Docs)仍然如此。
您可以使用 ruby 方法:
:root_url
这将获取带有基本 URL 的完整路径:
localhost:3000/bla
评论
:root_url
some_method(:products_brand_url, brand: brand, entity_name: "brand")
some_method
http://localhost:3000/brands/brand_name?&entity_name="brand"
http://localhost:3000/brands/brand_name
entity_name
root_url
对于 rails 3 :
请求.fullpath
request.env["REQUEST_URI"]
适用于 Rails 2.3.4 测试,不知道其他版本。
你可以在 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:
request.original_url
或
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_parameters
request.base_url + request.path
end
轨道 4
控制器:
def absolute_url
request.base_url + request.original_fullpath
end
Action Mailer 4.2 版本中的重要更改:
link_to 和 url_for 在模板中默认生成绝对 URL,则不再需要传递 only_path: false。(提交)
视图:
如果使用后缀,则生成的 URL 是绝对的。用于获取相对 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.url
希望它能解决您的问题。
干杯
您可以使用
request.original_url
或
"#{request.protocol}#{request.host_with_port}"
获取当前 URL。
您可以将变量设置为 ,我还没有在这里看到这个建议,它对我有用。URI.parse(current_url)
对于 Rails 3.2 或 Rails 4只需以这种方式“request.original_url” 参考:原始 URL 方法
对于 Rails 3由于 request.url 已弃用。我们可以通过连接来获得绝对路径
"#{request.protocol}#{request.host_with_port}#{request.fullpath}"
对于 Rails 2
request.url
对于 Rails 3.x 及更高版本:
#{request.protocol}#{request.host_with_port}#{request.fullpath}
对于 Rails 3.2 及更高版本:
request.original_url
因为在 rails 3.2 及更高版本中:
request.original_url = request.base_url + request.original_fullpath
欲了解更多信息,请访问 http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-original_url
评论