- 2007/09/03
- Ruby
以前から大分気になっていて、本格的に手を付けることがなかった言語「Ruby」。今更というかブームはもうすぎて定番言語になっている感も否めないが、なんだか楽しそうなので勉強をかねてブログで連載してみることにした。
まずは、Rubyについて
Rubyは、手軽なオブジェクト指向プログラミングを実現するための種々の機能を持つオブジェクト指向スクリプト言語です。本格的なオブジェクト指向言語であるSmalltalk、EiffelやC++などでは大げさに思われるような領域でのオブジェクト指向プログラミングを支援することを目的としています。もちろん通常の手続き型のプログラミングも可能です。
Rubyはテキスト処理関係の能力などに優れ、Perlと同じくらい強力です。さらにシンプルな文法と、例外処理やイテレータなどの機構によって、より分かりやすいプログラミングが出来ます。
ごっそり引用してきた。要はPerlのオブジェクト指向言語と言えるのかな。
RubyでCGI
そもそもRubyでなにができるの?っていうのが最初の疑問。しばらくPHPでのWebアプリケーションしか作ってこなかったから、プログミング=Webみたいな錯覚になっていたけど、RubyはWebももちろんできるし、ShやPerlみたいにテキスト処理しまくりなこともできる。けど、やっぱり分かりやすいのはWebアプリケーションなので、RubyでWebアプリケーション、CGIをやることにした。
フォームのデータを受け取る
いきなり掲示板を作るとか、メールを受信して解析&自動返信とかはちょっと面倒なので、シンプルにフォームのデータを受け取って表示するというものを作ることにした。まぁ、最初だから…ということで。
RubyをCGIとして動かすためには、PerlのようにRubyのパスをファイルの先頭に記述し、実行権(0755など)を与えてあげるだけ。
#!/usr/local/bin/ruby
HTMLとして表示するためにお決まりのヘッダを出力してやる必要がある。
#!/usr/local/bin/ruby print "Content-type: text/html\n\n" print 'hoge'
Rubyは文の最後にセミコロンを必要としない。と思って調べてみたら、セミコロンもしくは改行で式の終わりを区切っているみたい。リファレンスの例を見ているとセミコロンをつけていないので、Rubyでは改行で区切るのが一般的なのかな?
フォームのHTMLを書きたいのだが、printでいちいち記述するのは面倒なので、ここはヒアドキュメントを使用することに。
#!/usr/local/bin/ruby print "Content-type: text/html\n\n" print <<EOM <html> <head> <meta http-equiv="Content-type" content="text/html; charset=euc-jp"> </head> <body> <h1>Rubyでフォームのデータを受け取る</h1> <form action="00.cgi" method="post"> <input type="text" name="textdata" value=""> <input type="submit" value="入力文字を表示"> </form> </body> </html> EOM
HTMLの文法がちょっといい加減なのは見逃してください。ともかくこれで、フォームにもデータを入力する部分が整った。入力したデータを受け取るにはライブラリを読み込む必要がある。
#!/usr/local/bin/ruby require "cgi" cgi = CGI.new strdata = cgi["textdata"]
ここからPerl並みに面倒くさい手続きを踏むのかなーと思ったら、フォームデータの受け取りはこれだけでOK。これでなんと<input type="text" name="textdata">の value が strdata に格納されてしまっている。
変数を表示する
strdataに入っているデータを表示する。普通に print を使うだけだが、一応中身があるかどうかの判定をしてあげることにした。
#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"
#ライブラリ読み込み
require "cgi"
cgi = CGI.new
#入力データが空でなければ格納
if cgi["textdata"] != "" then
strdata = '<p>' + cgi["textdata"] + '</p>'
else
strdata = '<p>未入力です</p>'
end
print <<EOM
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=euc-jp">
</head>
<body>
<h1>Rubyでフォームのデータを受け取る</h1>
<form action="00.cgi" method="post">
<input type="text" name="textdata" value="">
<input type="submit" value="入力文字を表示">
</form>
#{strdata}
</body>
</html>
EOM
これにて完成。
ヒアドキュメントの中、ダブルクォーテーションの中で変数を展開するには #{変数名} とやればOK。それ以外であれば変数名をそのまま記述するだけ。PHPとは文法が大分違うので戸惑ったけど、なんとなく分かってきた。それから、読み込んだCGIライブラリには便利な class がいっぱいあるっぽい。
今回のまとめ
まとめるほどの内容ではないが…。
- CGIとして実行するためにRubyのパスを記述する
- パーミッションの設定
- 式の終わりにセミコロンは必要ない
- フォームのデータを受け取るには cgi を読み込んで、CGI.newを呼び出す
- Rubyでは、fales または nil だけが偽。0 は真として扱われる
せっかくRubyをやるなら Ruby on Rails を使えって感じだけど、あえて素の Ruby でやることにしました。だって、そっちの方が楽しそうなんだもの。でも、ある程度 Ruby のことを学習したら Rails にも手を出す予定。
追記:2007-09-03
入力データを受け取る基本的なことだけしか書かなかったけど、HTMLエスケープせずに表示するのはあまりにもアレなので、HTMLエスケープするようにしました。方法は非常に簡単。
#strdata = '<p>' + cgi["textdata"] + '</p>' # cgi["textdata"] の中のエスケープすべき文字を自動でやってくれる CGI.escapeHTML を使う strdata = '<p>' + CGI.escapeHTML(cgi["textdata"]) + '</p>'
CGI.escapeHTML() を使えば自動的にエスケープをしてくれる。
参考
- Newer: Rubyはじめました2:ファイル読み込み&書き込みで掲示板
- Older: 今さらTwitterはじめました