Rails3.0.4以下ではvalidationのmessageがproduction環境で正常に表示されない

久々にハマったのでメモ。
次の環境でvalidationのmessageがproduction環境で正常に表示されない現象が発生しました。

この環境で次のようにモデルにバリデーションを設定します。

  • app/model/user.rb
class User < ActiveRecord::Base
  validates :code, :presence => true, :length => {:maximum => 100},
            :format => { :with => /^[a-zA-Z0-9]+$/, 
            :message => I18n.t("activerecord.errors.messages.alphanumeric") }
end

「コードは半角英数字しかだめですよ」って意味ですね。

次は日本語メッセージ関連

  • config/locales/attributes.ja.yml
ja:
  activerecord:
    attributes:
      user:
        code: コード
  • config/locales/ja.yml
ja:
  activerecord:
    errors:
      messages:
        alphanumeric: "は半角英数字で入力してください。"
  • config/application.rb
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.default_locale = :ja

こんな感じで設定してproduction環境で実行すると次のような現象が発生します。

「translation missing」とな?ちなみにdevelopment環境で実行すると次のとおり。

問題なしです。

OSのlocaleを確認したり、デフォルトのlocaleをコードで書き換えたりしたけど改善せず。もしかしてと思ってRails自体のバージョンを最新の3.0.7に上げてみると直ってました。単なるバグだったみたい。このバグはバージョン3.0.4以下のRailsで発生するみたいです。もりもり作ってデプロイしてから不具合に気づくとがっかりなので、早めにバージョンアップしておきましょう。