Ruby1.9でERBを使おうとしてはまる
新しいシステム向けの検索システム
(分散KVSで汎用的に作ろうとして、予算の都合で断念したやつ)の、
コアエンジン部分が先日完成しまして
検索部分をDBにやらせて、データ取得はKVSという、
結果的にこれからのシステムが行き着きそうな仕組みになったわけですが、
これは本題ではないので置いておいて・・・
ともかく、出来上がったものを社内に公開する必要があったので、
簡単なWebUIをSinatraで書きました
こういうルーズな使い方ができるあたりがSinatraの良さです(`・ω・´) b
手動で起動しての動作は確認し、config.ruを書いてのrackupも成功したので、
Passenger経由で自動起動化しようとしたら、なんかエラーになりまして
Encoding::CompatibilityError - incompatible character encodings: ASCII-8BIT and UTF-8: /hoge_path/piyo.erb:xx:in `concat'
もう「The Ruby1.9」って感じのエラーですが、
明らかにerbをASCII-8BITで読み込んでしまい、
UTF-8のコードとぶつかってる感じです
とはいえ、Sinatra単体やRack経由では普通に動いたわけで、
Passengerに何か足りてないのか、
RackかSinatraがフォローしてるのかのどちらかでしょう
ここで「やっぱりRuby1.9は早いか・・・(´・ω・`)」と、
Ruby1.8系に切り替えるのも無難な手だし、プロの判断としてありなのですが、、
今回の検索システムはスピード重視なので、できればRuby1.9でやりたいのです
そこで、いろいろ調べていたら、
erbにも「magic comment」がつけられるようなんですね
<%# coding: UTF-8 %> <%# あとは普通のerb %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ...
これで見事に動くようになりましたヽ(`・ω・´)ノ
ただ、冷静に考えると、既存のRailsアプリ等、
erbを使ったアプリをRuby1.9に移植する場合、
erbファイル全部の先頭にこれを書かなきゃいかんわけです
今回は新規開発なのでこれでやっちゃいますが、
Ruby1.9への移行する際の障害の一つとして、
覚えておいた方がいいかもしれません
でも、たぶんもっといい手があるんだろうな・・・