roy > naoya > 基礎プログラミングII[月2] > (10)CGI[2]> 補足
通常のプログラムと同じように、openメソッドを使って外部のファイルからの読み込みや、書き出しをすることができる。
<form method="POST" action="./open-cgi.rb"> <p> 猫と犬のどちらが好きですか?<br> <input type="radio" name="choice" value="cat">猫 <input type="radio" name="choice" value="dog">犬<br> <input type="submit" name="ok" value="投票"> <input type="reset" name="ng" value="リセット"> </p> </form>
質問にはラジオボタンを用いている。2つのラジオボタンを同時に選択することが出来ないよう、name属性をchoiceに統一している。選択したボタンに対応するvalue属性の値がkeyであるchoiceに対応するvalueとして、CGIスクリプト(open-cgi.rb)に送られる。
#!/usr/bin/env ruby require 'cgi' c = CGI.new("html4") print"Content-type: text/html; charset=EUC-JP\n\n" data = c["choice"] cat = 0 dog = 0 open("open-cgi.dat","r+") do |hoge| while line = hoge.gets if /cat/ =~ line cat += 1 elsif /dog/ =~ line dog += 1 end end if data == "cat" cat += 1 hoge.printf("%s\n",data) elsif data == "dog" dog += 1 hoge.printf("%s\n",data) end end print"<html> <head><title>結果発表</title></head> <body>\n" print"<h1>投票数:#{cat+dog}</h1>\n" print"<table border=1>\n" print"<tr><td>猫</td><td>" 1.upto(cat) do |i| if i%20 == 0 print"■<br>" else print"■" end end printf(" %d</td></tr>\n",cat) print"<tr><td>犬</td><td>" 1.upto(dog) do |i| if i%20 == 0 print"■<br>" else print"■" end end printf(" %d</td></tr></table>\n",dog) print"</body>\n" print"</html>\n"
入力フォームで選択されたデータは、ハッシュ変数cのkeyとvalueという形で取り出されている。その後、openメソッドを用いて、open-cgi.datを開いている。モードはr+とし、読み込みも書込みも出来るようにしている。open-endの中で、まず、while-endを使ってファイル内の値を順番にとりだし、これまでの得票数をcatとdogにそれぞれ代入しておき、その下のif-endで今回の得票の加算と、ファイルへの書込みを行っている。
HTMLへの結果出力時には、1票を■1つで表現し、それぞれ得票数を示している。演算子%は割り算の余りという意味であり、20で割ったときの余りが0の場合のみ<br>をつけることで、20票ずつ折り返して表示できるようにしている。
このCGIをうまく動かすためには、事前にopen-cgi.datを作成しておく必要がある。その上で、自分以外の第三者がこのファイルへの読み書きができるようファイルのアクセス権限を変更する必要がある。具体的にはktermでchomodコマンドを使用して次のように入力する。
pan{c10xxxx}% chmod 666 open-cgi.dat[Return]