その他
    ホーム 技術発信 DoRuby 【Rails】バリデーションのエラーメッセージにI18nを使うとキャッシュされる
    【Rails】バリデーションのエラーメッセージにI18nを使うとキャッシュされる
     

    【Rails】バリデーションのエラーメッセージにI18nを使うとキャッシュされる

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    エラーメッセージをvalidatesメソッドに指定する際、
    I18nで国際化した文字列を使用するとキャッシュされてしまうようです。

    validates :name, presence: { message: I18n.t('.invalid') }
    

     
    現象として、キャッシュされたものが表示されたり、エラーとなったり、
    翻訳されずに英語のままになったりと、挙動が不安定になるケースがありました。

     
    バージョン
     rails 4.2
     rails-i18n-4.0.9

     
    対策としては、Procオブジェクトを使用すると解消されるようです。

    validates :name, presence: { message: Proc.new{ I18n.t('.invalid') } }
    

    lambdaでも同様ですが、
    単純にブロックを指定しただけでは解消されません。
    以下はどれも同様に解消されます。

    validates :name, presence: { message: Proc.new{ I18n.t('.invalid') } }
    validates :name, presence: { message: proc{ I18n.t('.invalid') } }
    validates :name, presence: { message: lambda{ I18n.t('.invalid') }.call }
    

     
    バリデーションメッセージだけでなく、scopでも同様の現象が発生するようですが、
    とりあえず今回はバリデーションの表示のみです。