caches_actionで携帯で画像が表示されない
###環境
クライアント:携帯
サーバ
- apache
- mongrel
- mongrel_cluster
- rails
+actionキャッシュを使用している。
rails>>
class BlobsController < ApplicationController
layout nil
caches_action :show
session :off, :only => :show
<<--
###状況
cacheがないページにアクセスすると、正しく表示される。どうやらcacheを返したときに、(携帯で)うまく表示できない様子。
PCではcacheがあっても、なくても正しく表示される:firefox。PCのブラウザは賢い。
###ログを確認:cacheがあるのでhaltedしたというメッセージ
これはcacheがあるので、ActionCacheFilterを中止して、cacheを返す時のメッセージ。なのでエラーではない。
shell>>
Processing BlobsController#show (for 219.125.148.54 at 2008-07-02 10:49:02) [GET]
Parameters: {"digest"=>"d8de32d0ad4bcf08016c6cedd31d426b", "action"=>"show", "controller"=>"blobs", "formats"=>[]}
Filter chain halted as [#<ActionController::Caching::Actions::ActionCacheFilter:0xb72d10c4 @actions=#<Set: {:show}>, @options={}>] rendered_or_redirected.
Filter chain halted as [#<ActionController::Filters::ClassMethods::ProcWithCallFilter:0xb72d0de0 @filter=#Proc:0xb751d184@/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:657>] did_not_yield.
Completed in 0.00035 (2833 reqs/sec) | DB: 0.00000 (0%) | 200 OK [http://mmmuji.s21g.com/blobs/d8de32d0ad4bcf08016c6cedd31d426b]
<<--
###詳しく状況を確認:Content-Typeが正しくない
サーバ、クライアントの両方のキャッシュを削除して、サイドブラウザからアクセス、画像を表示してfirefubのNetタブで確認すると、Content-Type: jpg; charset=utf8となっている。
瀧内さんからもらったアドバイス:caches_actionはヘッダーをキャッシュしない、mongrelはヘッダーについてKY(空気読まない)
###Content-Typeを設定するいくつかの方法
- mongrelで設定
- plugin(cache_fuなど)を使う
- railsで設定:config/initializers/mime_types.rb
- 表示時に設定(これはaction_cachesはヘッダーをキャッシュしないので、キャッシュ表示時には意味がない)
###結論:正しいContent-Typeは(特に携帯には)大事
上記の方法以外にも、mongrelをやめるという選択肢もあるのですが、とりあえず、railsでヘッダを設定するのはmongrelをやめても邪魔にならない設定であるのでそれをやってみました。
正しくContent-Typeが設定され、携帯からでもちゃんと表示されました!
後mime_types.rbでimage/jpgなどと致命的ミスをしてハマったというのもありました。
###Refs
http://rubyforge.org/pipermail/mongrel-users/2006-May/000237.html
http://www.igvita.com/2007/06/13/caching-and-mime-types-in-rails/:cache_fuでのmime_typeキャッシュ