Ruby で CGI 書くとき
require "cgi" して簡単なのを書くときの指針がやっとできたのでメモ。
require "cgi"
class HogeCgiApplication
def initialize(cgi, opt={})
@cgi = cgi
end
def run
# リクエストの応じて他のメソッドに飛ばす
_, mode, rest = @cgi.path_info.to_s.split("/", 3)
if mode && respond_to?(mode)
send(mode, *rest)
end
end
def view
show(:param => "hoge")
end
def show(stash={})
b = binding
stash.each do |k, v|
eval("#{k} = stash[:#{k}]", b)
end
template = File.read(@opt[:Template])
self.class.class_eval { include ERB::Util }
@cgi.out("type" => "text/html") { ERB.new(template).result(binding) }
exit
end
end
cgi = CGI.new
hoge = HogeCgiApplication(cgi)
hoge.runセッション使ったりするので必ず cgi.out を使う。場合によっては cgi.out をオーバーライドしてうんぬんできる。
でもまぁフレームワーク使うならそれでいいんだろうなぁ。
自宅のは .rb なのは fcgi で動くようなラッパ書いて動かしてるけど……
http://lab.lowreal.net/trac/browser/c/cgi-wrapper 前に lowreal.net に書いたけど、エラーとかキャッチしてスタックトレース出すようにしたり。元のファイルを書き換えずにエラーハンドル追加できるので結構自分で使う分には便利に使ってたりする。CGI バージョンは今はたぶんちゃんと動いてないな。