簡體   English   中英

如何在 Ruby on Rails 中獲取當前絕對 URL?

[英]How do I get the current absolute URL in Ruby on Rails?

如何在我的 Ruby on Rails 視圖中獲取當前絕對URL?

request.request_uri只返回相對URL。

對於 Rails 3.2 或 Rails 4+

您應該使用request.original_url來獲取當前 URL。 當前 repo 的源代碼可在此處找到。

這個方法記錄在original_url method ,但如果你好奇,實現是:

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 請改用完整路徑。

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

編輯Rails 7 ( Docs ) 仍然是這種情況。

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

我啟動了一個調試器會話並查詢了請求對象:

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'] %>

根據您的路徑結構更改參數。

希望有幫助!

看起來request_uri在 Ruby on Rails 3 中已被棄用。

Using #request_uri is deprecated. Use fullpath instead.

使用 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 on Rails 3.0,並且大多數版本的 Ruby on Rails 都應該支持:

request.env['REQUEST_URI']

可悲的是,線程中的任何建議都沒有幫助我,除了有人說他使用調試器來查找他要查找的內容。

我創建了一些自定義錯誤頁面而不是標准的 404 和 500,但request.url/404而不是預期的/non-existing-mumbo-jumbo結尾。

我需要使用的是

request.original_url

您可以使用紅寶石方法:

:root_url

這將獲得帶有基本 url 的完整路徑:

localhost:3000/bla

如果通過相對,您的意思是沒有域,然后查看request.domain

(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 3.2:

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

我認為它會在任何地方工作

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

導軌 4.0

您可以使用request.original_url ,輸出將如下例所示

get "/articles?page=2"

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

您可以使用

request.original_url 

或者

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

獲取當前 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

如果你想具體一點,意思是,你知道你需要的路徑:

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

對於導軌 3:

request.fullpath

request.env["REQUEST_URI"]

在經過測試的 rails 2.3.4 中工作,不知道其他版本。

獲取不帶任何查詢參數的請求 URL。

def current_url_without_parameters
  request.base_url + request.path
end

您可以將變量設置為URI.parse(current_url) ,我在這里還沒有看到這個提議,它對我有用。

您可以使用:

request.full_path

或者

request.url

希望它能解決您的問題。

干杯

要獲取絕對 URL,這意味着from the root可以這樣顯示

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

users_url 幫助器生成一個包含協議和主機名的 URL。 users_path 助手只生成路徑部分。

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

導軌 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 是絕對的。 使用_path獲取相對 URL。

<%= link_to "Home", root_url %>

欲了解更多詳情,請訪問:

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

對於 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

您可以通過調用獲得絕對網址:

request.original_url

或者

request.env['HTTP_REFERER']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM