読者です 読者をやめる 読者になる 読者になる

RubyでCGI。

今日はRubyでCGI作成の覚え書き。
※mod_ruby上で動作テストをしましたが、cgiスクリプトとしても動くはずです。

■環境
  • Ubuntu 7.04jp
  • Ruby 1.8.5
  • Apache 2.2.3
  • mod_ruby 1.2.6
■CGI作成

RubyでCGIを作るのは簡単。
基本的には以下のように書くだけ。

#!/usr/bin/ruby

#CGIライブラリをロード
require "cgi"

#CGIオブジェクトを作成
cgi = CGI.new()

#送信されたフォームの値を得る
name = cgi['name']

#クライアントにレスポンス
#HTTPヘッダーを出力
puts cgi.header
puts "Hello " + name


cgi.headerはHTTPヘッダーを返すメソッドで、色々な指定ができる。

#文字コードを指定する
puts cgi.header("charset"=>"UTF-8")

他のパラメータは下のURLを参考に。

■サンプル作成

[内容]

  • フォームに名前を入力して送信すると、"Hello 名前"と表示するCGI

[ファイル構成]

  • cgi.html (フォーム送信画面)
  • cgi.rbx (名前を受け取って"Hello 名前"と表示するスクリプト)

[cgi.html]

<html>
<head></head>

<body>
<form action="./cgi.rbx" method="post">
    <input type="text" name="name">
    <input type="submit" value="OK">
</form>
</body>

</html>


[cgi.rbx]

#!/usr/bin/ruby

require "cgi"

cgi = CGI.new()

puts cgi.header("charset"=>"UTF-8")
puts "Hello " + cgi['name']

cgi.html,cgi.rbxを同じディレクトリに作成したら、
ブラウザからcgi.htmlにアクセスしてみましょう。
名前を入力して、"Hello 名前"と表示されれば正常に動いています。


基本的にはこれだけ知っていればいいはず。
次はセッション管理ですな。
ではでは

■未解決

mod_rubyの場合cgi.headerを使う代わりに以下でも良いらしい。
しかし実行すると正常に動作しない

print "HTTP/1.1 200 OK\r\n"
print "Content-Type: text/plain\r\n\r\n"
print "hello world"

http://www.modruby.net/doc/faq.ja.jis.html#label-9
http://arika.org/doc/debuan.mod_ruby.html.ja

HTTPヘッダがブラウザに表示されてしまう:-<
何故表示されてしまうのか知っている方がいましたら教えてください。

■参考

・Rubyリファレンス-cgi
http://www.ruby-lang.org/ja/man/?cmd=view;name=cgi