おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

Rails3.0.3でcookie_only => falseの指定を指定するときの注意

Rails3.0.3でsession_optionsの設定にcookie_only => falseを指定するとき、ちょっとした注意が必要になります。

cookie_only => false を指定すると、クッキーからセッションIDが拾えなかった場合、paramsからセッションIDを取得しようとします。
actionpack-3.0.3/lib/action_dispatch/middleware/session/abstract_store.rb

        def extract_session_id(env)  
          stale_session_check! do  
            request = ActionDispatch::Request.new(env)  
            sid = request.cookies[@key]  
            sid ||= request.params[@key] unless @cookie_only  
            sid  
          end  
        end  

paramsにアクセスするためにrequest.paramsがコールされますが、この際、
env[“action_dispatch.request.parameters”]に生成したparamsが保持されます。
そして以降、paramsを取得するときはこれを使用するのですが、そのためにRack内で後ほどマージされる予定だったcontroller と action の情報が params に含まれなくなってしまいます。

解決策としてはalias_method_chainなどを使って extract_session_id をちょっと修正し、処理後に
env[“action_dispatch.request.parameters”]をnilにしてあげればOKです。