つまづきながら

この木曜の祝日と週末、えんえんApacheMySQLRubyと戯れてました。SQL文の書き方から始めて、フォームに入力されたテキストを一つの項目としてDBに格納・表示するようなCGIが動くところまで。まだまだ道具の使い方を覚える段階で、思うようには進まないもんだね。まあ知識は確実に増えている。
いくつかハマったところがあったのでメモ。

CGIプログラム中でRubyMySQLライブラリをrequireできない

RubyからMySQLを利用するライブラリを使おうとして、

require 'rubygems'
require 'mysql'

としていたら、require 'mysql'のところでエラーになる。
これ、CGIではなくコマンドラインRubyインタプリタを起動して読ませたらちゃんと動くのだよね…。さっぱり原因がわからずあちこち検索して調べた結果、一応対処法は見つかった。
「{MySQLのインストールディレクトリ}/bin/ にあるlibmysql.dllを、{Rubyのインストールディレクトリ}/bin/ へコピー」で動作するようになる。
んー、魔術的。ApacheがどうやってRubyインタプリタを起動してるのかまでは調べてないので、根本の原因は何ともわからん。

CGIへのリクエストから返されるHTTPレスポンスのステータスライン

Apacheが自動的に「HTTP/1.1 200 OK」を付加している模様。
CGIプログラム中で、自分でステータスラインを書き出そうとすると、エラーになって動かない。追加した部分がHTTPヘッダと見なされ、不正なHTTPヘッダということになってしまうため。

「%」で始まる行に対するerbの動作

HTMLの出力はerbでテンプレートを書いて行ったのですが、「%」で始まる行に対する動作が怪しい。
erbを作った人のサイトには、「%で始まる行はRubyスクリプトとして扱い、末尾の改行を取り除くというオプションを追加しました。 erbコマンドではデフォルトでonになっています」と書いてある。
確かにerbコマンドから出力させたらそうなってるのだけど、コマンドラインからではなくRubyのオブジェクトとして使ったときに、「%」で始まる行がRubyスクリプトとして解釈されていない。

erbコマンドの場合

test.erb

<html>
  <head><title>test</title></head>
  <body>
% 3.times{
    <p>fooooo</p>
% }
  </body>
</html>

出力

>erb test.erb
<html>
  <head><title>test</title></head>
  <body>
    <p>fooooo</p>
    <p>fooooo</p>
    <p>fooooo</p>
  </body>
</html>
rubyから利用の場合

test.rb

require 'erb'

TEMPLATE =<<EOS
<html>
  <head><title>test</title></head>
  <body>
% 3.times{
    <p>fooooo</p>
% }
  </body>
</html>
EOS

erb = ERB.new(TEMPLATE)
erb.run

出力

>ruby test.rb
<html>
  <head><title>test</title></head>
  <body>
% 3.times{
    <p>fooooo</p>
% }
  </body>
</html>

仕様なのかどうかも分からないので、もう「そういうもの」ということにして使ってます。先頭に%を書く記法が使えなくても、「<%= %>」で囲む記法だけ使えばよいので、実用上の問題はない。