$3 ブラウザからのデータの取得

3-2 フォームからのデータ取得 その1

いよいよフォームからの入力の説明です。 ただし、まずは、テキスト入力以外の、ラジオボタン、セレクトメニューなどのフォームからの データの処理について述べます。 テキスト入力の場合、文字コード変換などの問題などがあり、ややこしい処理が必要になります。 それ以外のフォームでは、自分が用意したデータのみを処理すればいいので簡単になります。

まず、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かには関係なく、 同じ方法でデータを取り出すことができます。


Next: 3-3 フォームからのデータ取得 その2

Previous: 3-1 リンクによるデータ取得

Contents


Foundation of CGI Page

春風はるか haruka@harukaze.net