つまづきながら
この木曜の祝日と週末、えんえんApache+MySQL+Rubyと戯れてました。SQL文の書き方から始めて、フォームに入力されたテキストを一つの項目としてDBに格納・表示するようなCGIが動くところまで。まだまだ道具の使い方を覚える段階で、思うようには進まないもんだね。まあ知識は確実に増えている。
いくつかハマったところがあったのでメモ。
CGIプログラム中でRubyのMySQLライブラリをrequireできない
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>
仕様なのかどうかも分からないので、もう「そういうもの」ということにして使ってます。先頭に%を書く記法が使えなくても、「<%= %>」で囲む記法だけ使えばよいので、実用上の問題はない。