Rails3 で ActiveRecord にて取得した UTF-8 の日本語を view に表示する
ActiveRecord にて取得した UTF-8 の日本語の情報を view で表示する方法です。
たとえば、Controller を下記のように記述します。
# coding: utf-8 class UserController < ApplicationController def index User.create({ :name => 'てすと', }) @user = User.find(:first) end end
そして、view を下記のように記述します。
<h1>日本語表示のテスト</h1> <%= @user.name %>
すると、下記のようなエラーが出て日本語を表示することが出来ません。
incompatible character encodings: UTF-8 and ASCII-8BI
これは、日本語を ActiveRecord 上では ASCII-8BI で扱い view 上では UTF-8 で扱っているため、違う文字コードの日本語を連結することは不可能であるというエラーのようです。
そのため view に日本語を一切書かなければ正常に表示することが出来ますが、そういうわけにもいきません。
単純に回避するのであれば、下記のように view 上で日本語を UTF-8 に強制的に encode してあげればエラーは出ません。
<h1>日本語表示のテスト</h1> <%= @user.name.force_encoding('UTF-8') %>
ですが、全てのデータ出力に force_encoding を付けていくのは DRY ではありません。
そこで app/helpers/application_helper.rb に下記のように記述すると force_encoding をしなくても日本語を表示できるようになります。
module ActionView class OutputBuffer < ActiveSupport::SafeBuffer def <<(value) super(value.to_s.force_encoding('UTF-8')) end alias :append= :<< end end
■お詫び
ActionView のオーバーライドは最初は config/environment.rb に記述してくださいと書いていましたが、設定を読み込む順番によってはオーバーライドされない現象が確認できました。
こちらは、app/helpers/application_helper.rb に記述することで動作することが確認できましたので、修正させていただきました。