いよいよフォームからの入力の説明です。 ただし、まずは、テキスト入力以外の、ラジオボタン、セレクトメニューなどのフォームからの データの処理について述べます。 テキスト入力の場合、文字コード変換などの問題などがあり、ややこしい処理が必要になります。 それ以外のフォームでは、自分が用意したデータのみを処理すればいいので簡単になります。
まず、HTMLでフォームを作る場合を見ましょう。
<FORM METHOD="GET" ACTION="ex2.cgi"> <H3>ページの色を決めてください</H3> <DL> <DT>背景の色 <DD><INPUT TYPE="radio" NAME="Back" VALUE="White" CHECKED>白 <DD><INPUT TYPE="radio" NAME="Back" VALUE="Yellow">黄色 <DD><INPUT TYPE="radio" NAME="Back" VALUE="Green">緑 <DD><INPUT TYPE="radio" NAME="Back" VALUE="Orange">オレンジ <DT>文字の色 <DD><INPUT TYPE="radio" NAME="Text" VALUE="Black" CHECKED>黒 <DD><INPUT TYPE="radio" NAME="Text" VALUE="Blue">青 <DD><INPUT TYPE="radio" NAME="Text" VALUE="Red">赤 <DD><INPUT TYPE="radio" NAME="Text" VALUE="Purple">紫 </DL> <INPUT TYPE="submit"> <INPUT TYPE="reset"> </FORM>
実際のページでは、下のように表示されます。
このページでボタンが押された場合、データはどうなるのでしょうか。
ここで重要なのは、HTMLの中の「NAME="Back" VALUE="White"」という部分です。
CGIへデータとして送られるのは、これら、NAMEとVALUEのペアが連結したもので、
本来はCGIプログラムで、この連結されたデータを切り離す作業が必要です。
しかし、Ruby では、その作業をやってくれる「cgi」というライブラリがあるので、
それを使います。
1: #! /usr/local/bin/ruby
2:
3: require "cgi"
4: data = CGI.new
5:
6: backcolor = data['Back']
7: textcolor = data['Text']
8:
9: print "Content-type: text/html\n\n"
10: print "<HTML><BODY BGCOLOR=#{backcolor} TEXT=#{textcolor}>"
11: print "<H1>こんにちは</H1></BODY></HTML>"
3行目で、cgiライブラリを取り込みます。
4行目では、CGIのデータを扱うためのオブジェクトを作り、ここでは「data」という名前にします。
6行目、7行目で実際のデータを取り出してます。
「data['Back']」で、「[ ]」の中が「Back」ということは、
この値が、もとのページの HTMLの「NAME="Back" VALUE="White"」の部分で選ばれた VALUEの値、
ということになります。
言い換えれば、もとのページの「Back」で「White」が選ばれた場合、
「data['Back']」の値は「White」となり、変数 backcolorに入ります。
同様に7行目で、変数textcolorの値がページで選ばれた VALUEの値になります。
注意: 実は、こうして出来た「data['Back']」というのは「配列」なのです。 この場合は一見問題ないのですが、このデータで文字列処理をしようとしたら、エラーになりました (この解決に一時間くらいかかりました・・・)。 したがって、正確には「data['Back'][0]」と書くべきです。
10行目で、表示するページのHTMLを出力しますが、この例では、ページの色を変えるので、 BODYタグの一部を変数に置き換えます。
注意: ここでは、送られてきたデータ(White、Blackなど)を、何も加工せずにそのままHTMLの文に入れて使える、という、 理想的な状況にあることを仮定しています。 しかし、実際のプログラムでは、変なデータが入ってきた場合の処理も必要です。
POSTとGETについて:
Rubyでは、cgiライブラリを使う場合、送られてきたデータがPOSTかGETかには関係なく、
同じ方法でデータを取り出すことができます。