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 を見て理解しました。