2012-05-03 8 views
6

現在、Rails 3は、一致するGETルートにHEADリクエストをルーティングします。頭がありますか?メソッドではなく、falseを返し、要求はget要求のように動作します。要求がHEAD要求であるかどうかを検出できますか?Rails 3のHEAD HTTPリクエスト

推理:HEADリクエストがgetと同じヘッダを返さなければならないことがわかるので、Railsは完全なGETを実行してから本体を削りたがっています。しかし、GETと同じDB呼び出しなどを発行せずにこの要求に従うことができます。これは理にかなっていますか?

+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 my 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で期待されるように機能します。 HEADリクエストの場合は201のレスポンスボディ、GETの場合は200のレスポンスボディが必要です。

+0

私は1.9.2とRails 3.1.4を持っています...私は何か間違っていることを完全に準備しています。私はさらに調査しなければならないでしょう...ありがとう。 –

+0

だから、本当の答えは、レールがHEADリクエストをGETを処理する同じアクションを通して強制することだと思います。ETagを生成する必要があります。 HEADが何か異なったことをした場合、クライアント側のキャッシュが破損する可能性が高くなります。そのように、正確な呼び出しを発行する必要があります.... 私は本当に頭を使用することができないのが好きですか?それがHEAD要求であることを知るために、私は(私が)推論を理解すると思う。 –

4

私はこの正確な問題を抱えていました。キャッシングを有効にすると、これが発生します。あなたの環境と#headでキャッシングをオフにしますか?期待どおりに動作します。

問題は、Rack :: CacheがHEADリクエストをGETリクエストに変換してキャッシュできることです。これは間違いなく正しい動作ですが、私のアプリケーションに干渉しました。

関連する問題