前回、ラジオボタンの例で説明しましたが、
CGIの処理としては、例外を除いて、他の場合でも同じです。
つまり、ページでラジオボタン、セレクトメニュー、テキストボックスだろうが、
CGIへは「NAME=VALUE & NAME=VALUE & ・・・」というふうに、
「NAME」と「VALUE」だけが送られるのです。
したがって、CGIでは「NAME」と「VALUE」の組み合わせだけで判断することになります。
言いかえれば、ページでラジオボタンだったのを、セレクトメニューやテキストボックスに置き換えても、
CGIプログラムは変える必要はありません。
(実際は、テキストボックスの場合は入ってくるデータが予測できないので、注意が必要です)
はじめに「例外を除いて」を書きましたが、その例外とは、チェックボックス、画像ボタン、 そしてファイルそのものを直接送る場合です。ファイルを送る場合については説明しません。
画像ボタン(INPUT TYPE=image)
の場合は、その画像のなかで、どの点がクリックされたのかが、
X座標、Y座標の数値のペアとして送られます。具体的には、
< INPUT TYPE=image SRC="button.gif" NAME="BUTTON" >
というボタンにたいして、例えば、
BUTTON.x=6 & BUTTON.y=15
というデータが送られます。
チェックボックスでは、ひとつの項目について、複数のデータを送ることができます。
プログラムの立場で言えば「NAME=VALUE」という形式は同じですが、
「Check=1 & Check=3 & ・・・」という感じに、
ひとつの「NAME」に対して、「VALUE」が何個あるかわからないという状況になります。
(ラジオボタンとかでは、ひとつの「NAME」に対して、
ただ一つの「VALUE」だけが必ずきます)
Rubyの CGIライブラリでは、前回の例で注意したように「data['Back']」というのは「配列」でした。
それで、仮にフォームで「Check」というNAMEのチェックボックスから複数のデータが来た場合は、
その分だけの配列になります。
つまり、「data['Check'][0]、data['Check'][1]、data['Check'][2]、・・・」ということで、
それぞれの値をとりだすことができます。
しかし、その配列の要素がいくつあるのかは、調べてみないとわかりませんし、
実際は、各項目に対する繰り返しを使うことが多いと思います。
この部分の処理は、例えば次のような感じになるでしょう。
(「Check」というNAMEのチェックボックスとします。)
1: for item in data['Check'] 2: print "<LI>", item 3: count += 1 #とか、適当な処理 4: end
配列に対するループの基本的な書き方です。
1行目で、配列「data['Check']」の要素をひとつ取り出して、それを「item」という変数にいれます
(もうちょっと正確には、配列の要素は何かわからないオブジェクトなので、
そのオブジェクトの名前を「item」とするということになります)。
2行目、3行目は、オブジェクト「item」に対する処理です。
これは、プログラムしだいで、もっと複雑なものになるでしょう。
4行目は、繰り返しブロックの終わりに書くお約束です。
ここで、「data['Check']」の要素が残っていれば、その要素が item という名前で、
同じ処理が繰り返されます。要素が無くなれば、 end の次の行に行きます。
Ruby の場合は、選択された項目が一個でも0個(選択されてない)でも、 とりあえず、これでうまく行くようです。