2012年01月19日

Ruby on Rails ActionView::Template::Error (incompatible character encodings: ASCII-8BIT and UTF-8)

ActionView::Template::Error (incompatible character encodings: ASCII-8BIT and UTF-8)


rails2からrails3へVersionUpしたときに出たエラーです。

環境


ruby1.9.3
rails3.0.7
mysql5.0.77

状況


formでデータを入力するページで、
text_areaにデータを入力するのだが、
初期のデフォルトのデータとして、特定のhtmlファイルを読み込んでその内容をtext_area内に表示、
2度目以降はDBに登録されたデータをtext_area内に表示するという仕組みがある。

このページをrails2からrails3へVersionUpした後に遷移したら
ActionView::Template::Error (incompatible character encodings: ASCII-8BIT and UTF-8)

というエラーが発生した。

原因


ruby1.9から文字列にエンコーディングが設定されて、
それがデフォルトでASCII-8BITになるのだが、DB adapter(MySQL/Ruby)がエンコーディングを気にせずに、デフォルトのASCII-8BITのまま返してしまうのが原因らしい。

だが、ruby1.9は前から使っていたが発生していないが?
rails3もなにか関係しているんだろうな。

解決策


他のサイト等を見るとバッチあてるとあるが、
1箇所だけで他のところはなんにもないのであまり変えたくないなーと思ったので、
ASCII-8BITに変換されるならUTF-8に変換してしまうことにしました。

ruby1.9からStringに文字コード系のメソッドが追加されたようです。
Ruby1.9をこれから使う人のためのM17Nまとめ
上記の中の
String#force_encoding(encoding)

こいつを使って
@hoge.force_encoding("UTF-8")

これで完成。
このまま登録して、再度外してもエラーになったので、
表示のコードを変換したからといって登録されるデータが変わるでもないので、
とりあえずこれで問題なし。
posted by RicK at 10:41| Comment(0) | TrackBack(0) | 日記