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