ramazeをCGIで使うときもセッションを使う
ramazeのセッションは、セッションに格納した値をメモリ上に記憶して、クッキーにセッションIDを格納する方式みたい。そのため、リクエストのたびにプロセス起動/終了を繰り返すCGIでramazeを使うと、ramazeのセッションは使えない。
そこで、自前のセッションを作って、セッションに格納した値はファイルに記憶するようにしてみた。
セッションを管理する処理のコードはこんな感じ。Ramaze::Store::Default(YAMLパーサのラッパ)を使ってます。
require 'ramaze/store/default' module FileSessionManager def file_session unless @file_session unless @session_directory @session_directory = 'session' end @file_session = Ramaze::Store::Default.new( File.join(@session_directory, "#{session.session_id}.yaml")) end return @file_session end end
利用するコードはこんな感じ。
class SimpleController < Ramaze::Controller engine :Erubis map '/' include FileSessionManager layout :layout def input @value = file_session[:session_value] %{ <form action="output" method="post"> 値:<input type="text" name="input_session" value="<%== @session_value %>"/> <input type="submit" value="入力" /> </form> } end def output file_session[:session_value] = request[:input_session] %{ 値: <%== file_session[:session_value] %><br/> セッションID: <%== session.session_id %><br/> <a href="input">input</a> } end def layout %{ <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <%= @content %> </body> </html> } end end
FileSessionManagerをincludeすると、セッションオブジェクトを返すfile_sessionメソッドが利用できるようになります。そのfile_sessionメソッドは、セッションオブジェクト(実際にはRamaze::Store::Default)を返します。
セッションに格納した値は、sessionディレクトリ以下のファイル"[セッションID].yaml"に格納されます。<2008/9/3追記>
FileSessionManagerをramazeのhelperにしてみました。詳しくは下記のエントリにて。
ramazeをCGIで使うときもセッションを使う(helper編) - NAT’s Programming Champloo