2012-05-03 38 views
6

Rails 3當前將HEAD請求路由到匹配的GET路由。有一個頭?方法在請求中,但是返回false並且請求的行爲就像獲取請求一樣。我可以檢測到請求是否是HEAD請求?Rails 3中的HEAD HTTP請求

推理:我得到一個HEAD請求應該返回與get相同的頭文件,所以Rails想要執行完整的GET,然後刪除正文。但是,我可以遵守這個請求,而不會發出GET所要求的相同的數據庫調用等。這有意義嗎?

+0

您可能需要張貼一些相關的代碼。頭部?方法應該爲HEAD請求返回true(http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F) – rjk

回答

2

您可以使用request.head?方法找出如果它是一個HEAD請求:

http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-head-3F

一旦你確定它就是,你也可以使用控制器的頭()方法,而不是典型的渲染:

http://guides.rubyonrails.org/layouts_and_rendering.html#using-head-to-build-header-only-responses

所以我只是檢查request.head?在打擾數據庫活動之前。然後使用

head :ok, :custom_header => 'value' 
+0

所以,這裏有一些[更多信息](https:/ /gist.github.com/2594991)您可以看到HEAD被路由到GET我的Rails,此時請求表示它是一個GET。我試過了頭?,但無法表明它是HEAD請求。 –

1
def index 
    if request.head? 
    head :created 
    else 
    Rails.logger.info "Derp #{request.method}" 
    end 
end 

嗯。上面的控制器方法就像我期望的那樣在Ruby v1.9.3-p194和Rails v3.2.3上運行; 201的無響應正文爲HEAD請求,200響應爲GET。

+0

我在1.9.2和Rails 3.1.4上......我完全準備好做錯了。我將不得不進一步調查......謝謝。 –

+0

所以,我認爲真正的答案是,rails通過處理GET的相同操作強制HEAD請求是B/c它必須生成ETag。如果HEAD做了一些不同的事情,它會(可能)破壞客戶端緩存。因此,確切的電話必須發出.... 我不喜歡,我不能真正使用頭?知道這是一個HEAD請求,但我(想我)理解這個推理。 –

4

我有這個確切的問題。事實證明,啓用緩存導致了這一點。在你的環境中關閉緩存和#head?將按預期工作。

問題是Rack :: Cache將HEAD請求轉換爲GET請求,以便它們可以被緩存。這可以說是正確的行爲,但它干擾了我的申請。