Rails3でMemCacheを利用する

セッションストアにMemCacheを利用してみる
やり方は、
参考サイト:http://www.banana-systems.com/2010/09/rails3_memcached/を参考にして、
config/initializers/session_store.rb
に次の行を追加

Railsアプリ名::Application.config.session_store :mem_cache_store
Railsアプリ名::Application.config.session_options = {:cookie_only => false,
:key => '_session',
:memcache_server => 'localhost:11211'
}

これで大体はいいのだけど、ブラウザからの初期アクセス時(サーバ側にまだセッションが作られていないとき)に、パラメータを読み込めない(request.paramsが空)という問題が発生(Rails 3.0.4)

cookie_only=>falseではなく、cookie_only=>true
ならこの問題は発生しないので、しばらくはcookie_only=>trueで使うことにします。

調査をしてみると、Railsソースコードでいうと、:cookie_only=>falseにすると、action_dispatch/middleware/session/abstract_store.rbモジュールのextract_session_idで、204行目の

sid ||= request.params[@key] unless @cookie_only

の処理が動作してしまい、このときparamsメソッドは、その実態がaction_dispatch/http/parametersモジュールのparametersメソッドなのですが(paramsは、parametersのalias)、空の値が
@env["action_dispatch.request.parameters"]
に入ってしまう。一度取り込まれると、二度目からparametersメソッドを呼び出しても{}が入っているので、{}のままになってしまう。
(||=は、左辺値がnilなら、右辺値で置き換えるので、左辺値が空{}である場合は、代入を行わない)

よって、request.paramsにも値が入らない。

本来は、cookie_only=>falseの場合は、どういう動作が正しいのでしょうかね。