CGIを使おう!

 

eRubyを使ってまず覚えたいことは、やはりCGIの使い方ですね。
これを使うことによって、ユーザーがブラウザに入力した値を読み取ることが出来ます。
皆さんおなじみのゲストブックや掲示板、チャットなどは全てCGIを使っています。
早速、サンプルページを作ってみましょう。
始めのページは、Rubyを使っていないので拡張子はhtmlにして保存しましょう。

<html>
<body>

<form action="action.rhtml">
    コメント欄:<input name="comment"><br>
    複数行コメント欄:<textarea name="comment2"></textarea><br>
    <input type=submit value="送信">
</form>

</body>
</html>

出力結果は、以下のようになります。

コメント欄:
複数行コメント欄:
続いて、送信されたデータを受け取るページを作ります。
このページではRubyを使うので、拡張子はrhtmlにする必要があります。
ここで先程のプログラムを見て下さい。
<form action="action.rhtml">
となっていますね?これは、このページで送信ボタンが押されると
"action.rhtml"というページに処理が移るということを意味します。
なので、次に作成するファイルの名前は"action.rhtml"にしましょう。

<html>
<body>

<%
require 'cgi'
cgi = CGI.new
%>

あなたがコメント欄に入力した値は、
<div align=center><%= cgi['comment'][0] %></div>
です。<br>
そして、複数行コメント欄に入力した値は、
<div align=center><%= cgi['comment2'][0].gsub(/\n/, "<br>") %></div>
です。

</body>
</html>

少しプログラムの解説をします。

・require文
CGIなどの拡張ライブラリを使うときには、そのための宣言をする必要があります。
それがrequireです。Cでいうところの#includeと同じ効果を持ちます。
CGIを含め、一般的なライブラリはRubyパッケージの中に含まれているので
これらを個別にインストールする必要はありません。

・cgiの初期化
CGIを使う宣言をしたら、まず始めに初期化する必要があります。
cgi = CGI.new
という部分がそれにあたります。
意味がわからなくても、とりあえずおまじないだと思って書いておけばそれでOKです。
以下、CGI関連のアクセスは全てこのcgi(←小文字)を通して行います。

・フォームに入力された値を読み取る
初期化を済ませたら、あとはフォームに入力された値を読み取るだけです。
cgi['名前'][0] と記述します。名前の部分には、送信側HTMLのname属性と同じものを入れます。

勘のいい人ならば、ここで「後ろの[0]って何?」と思ったかもしれません。
実は、cgi['名前']は 配列 を返すのでそのままでは使えないのです。
配列の最初の要素(つまり[0])に欲しい情報が入っているので、こういう記述法になってしまいます。
面倒だと思うかもしれませんが、チェックボックスを使う場合などは
一つのフィールドに複数の情報を返す必要があるのでこういう仕様になっているのです。
慣れてしまえばそれほど大した問題では無くなると思いますので、
始めのうちは我慢して使ってみて下さい。

注意!!
最新のRuby(1.8以降?)ではこの挙動がやや異なっています。
cgi['名前'][0]ではなく、cgi.params['名前'][0]を使う必要があります。
もしくは、単にcgi['名前']とすればcgi.params['名前'][0]と同じ値を得られますが
(互換性の為?)[]演算子がオーバーライドされてるので場合によっては注意が必要です。

例えば、dateフィールドの先頭から4番目の文字を得ようとした場合
以前なら cgi['date'][0][4] という風な使い方が出来ましたが、最新版Rubyでは
cgi['date'][4] という記述はcgi['date']と同じ値を返します(画面には警告が出る)。
cgi.param['date'][4]と記述する必要があります。

・<%= ... %>について
プログラム中に<%= ... %>という記述があります。
これは、...の内容をHTMLに出力するための構文です。
わかりやすい例を挙げると、例えば<%= str %><% print str %>と同じことを表します。

P.S.
ASPなどでは前者の手法は実行速度を落とす元凶と言われています。
eRubyでは計ったことが無いので何とも言えません…

・改行の変換
textareaフォームには、複数行の文字が入力できますよね?
これをプログラム側で受け取って画面表示する場合、
そのまま表示すると改行が無視されてしまいます。
これはHTMLの仕様なのでしょうがありません。
そこで受け取るプログラム側で、改行をHTMLで理解できるタグ<br>に変換してやります。
上の例で見ると、
cgi['comment2'][0].gsub(/\n/, "<br>")
という部分です。
gsubメソッドで、第一引数の文字(\n)を第二引数の文字(<br>)に変換しています。


今回はここまでです。次回は、データベースとの連動を考えます。
お楽しみに!!