Rails 3.2で、production環境の時にHEADメソッドが使えない

Rails 3.2.8、Rack 1.4.1, RackCache 1.2にて動作確認。

コントローラで

if request.head?
  render nothing: true, status: ok
else
  # 重い処理
end

のように、HEADリクエストでは余分な処理をしたくないこともあると思います。

上記のif文は、development環境では動くのですが、productionでは動きません。
デフォルトで利用されるRack::CacheのRack middlewareが、HEADを強引にGETに書き換えるため、head?が常時falseを返してしまいます。

issueとして解決済のようですが、3.2.8では反映されていないようなので、head?が動作するようにしてみました。

以下のように、config.ruに記載します。
Rack::Cacheより前に入れる必要があるほか、developmentではRack::Cacheが読み込まれず、判定がめんどくさいので一番最初にぶち込んでいます。

本当はconfig.ruにあまりごりごり書くのは良くないのですが、まあ、バージョンアップすればいらなくなるし・・・

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ