コンピュータリテラシー演習のページへ
Rubyによるはじめてのプログラミング

CGIでデータを読み込む

さて、いよいよフォームなどで入力したデータを読み込んで使うCGIプログラムを作成してみましょう。

まずは、フォームの例にあるフォームをform.htmlというファイル名で保存しましょう。以下のdispdata.cgi というプログラムで送られてきたデータを読み込んで、その内容をそのまま表示してみます。

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の値をもちます。

応用

単にデータを表示するだけではおもしろくないので、表示の内容を工夫してみましょう。

sports.cgi - 少しはまともな表示をするプログラム
#!/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を引いていることに注目してください。

課題

  1. 上記 dispdata.cgi を実行してみよ。フォームの各コントロールに色んな選択やテキストの入力をした例を3つ用意し、それぞれのCGIの結果を報告せよ。ただし、選択肢で何も選択しない場合やテキストに何も入力しない場合も例に含めること。
  2. 上記 sports.cgi を実行してみよ。スポーツを選択した場合、選択しない場合、学籍番号や名前を記入しない場合の結果を報告せよ。
  3. 上記 sports.cgi を元に、名前を記入していない場合に、名前を記入してくださいと表示するようなCGIを作成せよ。
  4. 上記 sports.cgi を元に、チェックボックスで好きなスポーツとして選択した項目を全て表示するCGIを作成せよ。例えば、野球とゴルフを選択した場合に、野球,ゴルフがお好きなのですね。と表示するようにせよ。

東京情報大学情報システム学科
大見 嘉弘(Yoshihiro OHMI)