35

Iモデルでは、以下の検証を持っている:モデルバリデーションのRails国際化(I18n):可能かどうか

翻訳がプロダクションモードで動作しないようです
validates_inclusion_of :whatever, :in => [true, false], :message => I18n.t('please_select_whatever') 

:すべての言語で、それは常に私がデフォルトとしての英語に設定おそらくので(diplayedます英語の翻訳です私のアプリのロケール...?)。

モデルの検証は翻訳されていないと仮定しています。モデルは一度しか読み込まれないため、サーバーが起動してからデフォルトのロケールが適用されるためです。

私は正しいですか?はいの場合、この問題をどのように解決しますか?

ありがとうございました!

答えて

44

ソリューションは、モデルは、その後、例えば、デフォルトのメッセージキーを適用します

:message => I18n.t('activerecord.errors.models.my_model.attributes.whatever.please_select_whatever') 

...のように、モデル内の任意のカスタムメッセージキーが含まれないことです「:インクルージョン」場合参照用

en: 
    activerecord: 
    errors: 
     models: 
     my_model: 
      attributes: 
      whatever: 
       inclusion: "Please select whatever." # see default key: "inclusion" 

、再チェックアウト:

"validates_inclusion_of" ...とあなたが持っている必要がありen.ymlのconfig /ロケール/中のspective Railsのガイド:

http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models

+0

私はいつもactiverecordのエラーメッセージのデフォルトを忘れています(数ヶ月おきにそれが必要です)。ありがたいことにGoogleがこの回答を何度も見つけてくれます! –

+0

=>この問題にアプローチするより良い方法は、以下の@iainの答えです。 –

+1

これは*なぜ* OPs解決策が機能しなかったかに対処しません。プロジェクトの_initialized_がdevで要求されたときに翻訳が解釈されましたが、prodで起動すると一度だけ解釈されます。複数の言語をサポートするには、@ iainのソリューションアドレスである_runtime_で解釈する必要があります。 TomDoggのソリューションは、すべての場合に同じデフォルトの翻訳を使用できる場合にのみ機能しますが、必ずしも最良のUXであるとは限りません。 – Woahdae

16

あなたは翻訳を指定するには、記号を使用することができます。

validates_inclusion_of :whatever, :in => [true, false], :message => :select_whatever 

そして、それは特定のスコープに変換されます。詳細は、I18n guideを参照してください。

+0

次の部分 ":メッセージ=>" の線に沿って何かする必要があります:(I18n.t「activerecord.errors.models 。[model_name] .attributes。[attribute_name] ') – TomDogg

+0

いいえ、これは動作しません。私は、Railsではモデル内での変換はできないと考えています(1回しかロードされないためです)。 – TomDogg

+4

私が行ったようにシンボルを使用し、翻訳を適切な場所に置きます(ガイドに記載されています)。ここでI18n.tに電話しないでください。私の例は正しい。 – iain

1

OK、iain回答作品が、私は:select_whateverを置くべき場所を把握するのに非常に長い時間がかかりました。

validates_inclusion_of :whatever, :in => [true, false], :message => :select_whatever

OKあなたen.ymlは次のようになります。

en: 
    errors: 
    messages: 
     select_whatever: "error!!"