さて、いよいよフォームなどで入力したデータを読み込んで使うCGIプログラムを作成してみましょう。
まずは、フォームの例にあるフォームをform.htmlというファイル名で保存しましょう。以下のdispdata.cgi というプログラムで送られてきたデータを読み込んで、その内容をそのまま表示してみます。
#!/usr/bin/env ruby require 'cgi' print "Content-Type: text/html\n\n" cgi = CGI.new print "<html><body><h1>Display direct data which is received CGI data.</h1><pre>\n" sports = cgi["sports"][0] print "sports = ", sports, "\n" baseball = cgi["baseball"][0] soccer = cgi["soccer"][0] basket = cgi["basket"][0] tennis = cgi["tennis"][0] golf = cgi["golf"][0] print "baseball = ", baseball, "\n" print "soccer = ", soccer, "\n" print "basket = ", basket, "\n" print "tennis = ", tennis, "\n" print "golf = ", golf, "\n" dept = cgi["dept"][0] print "dept = ", dept, "\n" s_id = cgi["student_id"][0] print "student_id = ", s_id, "\n" name = cgi["name_id"][0] print "name = ", name, "\n" com = cgi["comment"][0] print "comment = ", com, "\n" print "</pre></body></html>\n"
ここでは、RubyのCGIライブラリを使っています。 ライブラリというのは、プログラムを作成する上で便利なように作られたプログラムです。 CGIライブラリは、CGIを扱う上で、通常なら面倒な処理を行わないといけない部分を代りにやってくれます。このプログラムでは、面倒なことはCGIライブラリにまかせて、簡単に作ることができています。CGIライブラリの詳細はRuby 1.6 リファレンスマニュアルの中の添付ライブラリの中(CGI)にあります。
CGIライブラリを使うには、require 'cgi'と書きます。 その後、cgi = CGI.newというおまじないをします。 そうすると、後は cgi["コントロール名"][0]とすると、コントロール名で指定したデータ(コントロール値)が得られます。 例えば、上の例では、フォームのラジオボタンでサッカーを選んだ場合、コントロール名は、 "sports"でコントロール値は"2"のはずですから、cgi["sports"][0]と書くと "2" という値が得られるはずです。上の例では、sports = cgi["sports"][0]として、いったん変数sportsに代入してから使用しています。
なお、[0]をつけるのは、cgi["コントロール名"]が返す値が配列であるためで、[0]をつけて配列の最初の要素を取り出しています。 複数の値を取るコントロール値がありうるため、配列にして返しているのです。 なお、CGIとしてコントロール名自体が送られてきていない場合には、 cgi["コントロール名"][0]は、 nilの値をもちます。
単にデータを表示するだけではおもしろくないので、表示の内容を工夫してみましょう。
#!/usr/bin/env ruby require 'cgi' print "Content-Type: text/html\n\n" cgi = CGI.new print "<html><body>\n" sports = cgi["sports"][0] s_id = cgi["student_id"][0] name = cgi["name"][0] if (s_id == "") then s_id = "未記入" end if (name == "") then name = "名無し" end print "学籍番号", s_id, "の", name, "さんは、" if (sports) then sports_a = ["野球", "サッカー", "バスケットボール", "テニス", "ゴルフ"] print sports_a[sports.to_i-1] print "が一番お好きなのですね。#{sports}\n" else print "一番お好きなスポーツを答えていただいておりません(;_;)\n" end print "</body></html>\n"
学籍番号や名前が未記入の場合には、例えば、if (s_id == "") then s_id = "未記入" end として、未記入という文字列を代入していることに注目してください。また、一番好きなスポーツに何も選択していない場合は、 cgi["sports"][0]は、nilの値を持ちます。その場合、if (sports) then はsportsがnilですから成り立たなく、else 〜 end の間が実行されるのです。
sportsが選択されている場合は、配列sports_aを使って対応するスポーツ名を表示しています。 まず、コントロール値はそのままでは文字列であるので、sports.to_iとして整数値に変換しています。また、配列の添え字は0から始まりますが、この場合、野球が1、サッカーが2、 バスケットボールが3という風に1から始まっていますので、sports.to_i - 1 として1を引いていることに注目してください。