ramazeをCGIで使うときもセッションを使う(helper編)

ramazeをCGIで使うときもセッションを使う - NAT’s Programming Champloo
上記エントリで、セッションをファイルに格納するモジュールFileSessionManagerを作りました。その続きです。
ramazeなら、FileSessionManagerみたいなモジュールはhelperにした方が良いよ、とコメント頂いたので、自分用helperにしてみました。自分用helper(custom helper)の作り方は、教えて頂いた、下記のページを参考にしました。
http://ramaze.net/features:helpers#custom-helpers
セッションを管理するhelperのコードはこんな感じ。モジュールをRamze::Helperの中で定義します。

require 'ramaze/store/default'

module Ramaze
  module Helper
    module FileSession
      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
  end
end

ファイル名は、キャメルケースにするとモジュール名 FileSession になるように、file_session.rb として保存します。


利用するコードはこんな感じ。include の代わりに、 helper :file_session と入れてます。

require 'ramaze'
require 'file_session'

class SimpleController < Ramaze::Controller
  engine :Erubis
  map '/'
  layout :layout
  helper :file_session

  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

最初の方に require 'file_session' とやっているけど、ディレクトリ ramaze/helper の下に file_sesion.rb を置けば、require は不要です。正確には、ロードパス($LOAD_PATH)にファイル ramaze/helper/file_session.rb があれば、helper :file_session がそのファイルを探して、読み込んでくれます。
この辺の動きはよく分からなかったので、直接ramzeのソース ramaze/helper.rb を見て理解しました。