roy > naoya > 基礎プログラミングII[月2] > (10)CGI[2]> 補足

(10) 12/10の授業内容:CGI[2]補足

openメソッドと組み合わせる

通常のプログラムと同じように、openメソッドを使って外部のファイルからの読み込みや、書き出しをすることができる。

猫と犬のどちらが好きですか?

入力フォーム(choice.html)

<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)に送られる。

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]

前のページに戻る