basyura's blog

あしたになったらほんきだす。

cgi で mvc その2

試行錯誤中。PStore による session 情報の保持と、erb による描画を追加してみた。puts の出力先をコンソールにしたかったんだけど。

gup.cgi

#!/usr/bin/ruby -Ku

require 'cgi'
require 'cgi/session'
require 'cgi/session/pstore'
require 'erb'

def puts(msg)
	$stderr.puts  msg
end

def render(src)
  ERB.new(open(src){|f| f.read}).result(binding)
end

cgi = CGI.new
session = CGI::Session::new(
  cgi , 
  { 
    "database_manager" => CGI::Session::PStore ,
    "prefix" => "gup_" ,
    "tmpdir" => "/tmp"
  })

info = cgi.path_info.split("/")
info[2] = "index" if info.length < 3 || !info[2]
load info[1] + ".rb"
app = eval(info[1].capitalize + ".new")
app.instance_variable_set("@params"  , cgi.params)
app.instance_variable_set("@session" , session)

cgi.out({
  "type"       => "text/html",
  "charset"    => "utf-8",
  "connection" => "close",
}){ app.__send__(info[2]) }

exit

test.rb

class Test
  def index
    @name = @session["name"] ||= ""
    render "test.rhtml"
  end
  def list
    @session["name"] = @params["name"][0]
    CGI.escapeHTML "こんにちは #{@params['name']} さん"
  end
end

test.rhtml

<html>
  <head></head>
  <body>
    <form action="/gup/test/list" method="post">
      名前をどうぞ <input type="text" name="name" value="<%= CGI.escapeHTML(@name) %>">
      <input type="submit">
    </form>
  </body>
</html>

機能実装していくほどに重くなって rails でいいじゃんとかなるんだろうな。どちらにしろ久々の勉強ネタとして継続したい。