2006年 09月 25日

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 バージョンは今はたぶんちゃんと動いてないな。