32

私はメッセージ句を使ってその検証のためだけに特別なメッセージを表示する特殊な検証を持つ属性を持っています。ここに1つの例があります:Ruby on Rails i18n - モデル内のカスタムメッセージを翻訳したい

validates :email, presence: true, length: { maximum: 60 }, 
       format:  { with: valid_email_regex, message: "is not a valid email address format." }, 
       uniqueness: { case_sensitive: false } 

ここでメッセージを翻訳したいと思いますが、どうすればよいかわかりません。

私は、メッセージ:t( "some_value_here")のようなものを入力する例を見てきました。私はその指定についてはわかりません。私はこのメッセージのようなものを試しました:t(:bad_email)。私は何かを試してみるために私のyamlファイルで次のことをしました。

ActionView::Template::Error (undefined method `t' for #<Class:0x007fefc1b709e0>) 

は、私も私のYAMLファイルでこれを試してみました:私は、次のエラーを得た私のRailsアプリケーションにアクセスしようとしました

activemodel: 
    errors: 
    bad_email: "is not a valid email address format." 

私はこれをオフに研究されている

activemodel: 
    errors: 
    user: 
     bad_email: "is not a valid email address format." 

一日中私が見つけることができるのは、空白または空のような組み込みのエラーハッシュを置き換えることだけです。カスタムエラーハッシュを使用してモデル内で置き換える方法がありますか?この時点で私はコード化されたものとして働かせることはできません。私の希望は、問題は私のyamlファイルの設定方法です。私はこれを設定する方法のさまざまなバージョンを見てきました。私はこれをアクティブモデルまたはアクティブレコードの下に置くべきかどうかはわかりません。私はそれが私が翻訳したいカスタムメッセージであるので、私はactivemodelを想定しました。

ご協力いただければ幸いです。これは、アプリケーションの最初の翻訳を開始する前に私が把握する必要がある最後の部分です。

UPDATE 2013年7月29日午後7時30分CDT

bgatesは私に私のモデルファイルはYAMLファイルにカスタムメッセージを受信する方法を設定して非常に良いスタートを与えました。しかし、カスタムメッセージが見つかるようにyamlファイルで次の設定を行う必要がありました。このモデルに固有の翻訳がある場合

[lang]: 
    activerecord: 
    errors: 
     messages: 
     bad_email: "just ain't right" 

、それは上記の一般的なものを上書きしますYAMLファイルで、その後

validates :email, presence: true, length: { maximum: 60 }, 
      format:  { with: valid_email_regex, message: :bad_email }, 
      uniqueness: { case_sensitive: false } 

activerecord: 
    errors: 
    models: 
     user: 
     attributes: 
      bio: 
      no_links: "cannot contain email addresses or website links (URLs)." 
      email: 
      bad_email: "is not a valid email address format." 
      username: 
      bad_username: "can only contain numbers and letters. No special characters or spaces." 

答えて

63

メッセージのシンボルを使用します。

[lang]: 
    activerecord: 
    errors: 
     models: 
     model_name: # or namespace/model_name 
      attributes: 
      email: 
       bad_email: "model-specific message for invalid email" 

カスタム検証を書く場合、add_error(:email, :bad_email)は上記のルックアップを行いますが、errors[:email] << :bad_emailはそうしません。

+0

私のセットアップ私のモデルとYAMLファイル。私はactiverecord.errors.models.user.attributes.email.bad_emailの翻訳が欠落しています。私は私のyamlファイルに行った変更を私の記述に入れました。うまくいきます。私が手伝ってくれてありがとうございます。 –

+0

トップレベルのキーとして 'activerecord'の代わりに' activemodel'を使用しなければなりませんでした。詳細は、エラー[ソース](https://github.com/rails/rails/blob/ccbc98e37dcc11ad5150b93dcee8008bc94aa83a/activemodel/lib/active_model/errors.rb#L465-L472)を参照してください。 – Nick

+0

素敵なトリック、ありがとう –

20

私はちょうどこのすべてを歩いて、rails guides for custom validatorsがハードコーディングされていることがわかりました...私はあなたが尋ねたものではありませんが、Qのタイトルが完全に合っています私の問題のために)。国際化メッセージと

カスタム検証:

validate :something_custom?, if: :some_trigger_condition 

def something_custom? 
    if some_error_condition 
    errors.add(:some_field_key, :some_custom_msg) 
    end 
end 

# en.yml 
activerecord: 
    errors: 
    models: 
     some_model: 
     some_custom_msg: "This is i18n controlled. yay!" 
3

これに対する解決策は、カスタムである必要はありません。 formatバリデータメッセージはすでに:invalidシンボルにマップされています。無効な翻訳のみを設定する必要があります。

en: 
    activerecord: 
    errors: 
     models: 
     some_model: 
      attributes: 
      email: 
       invalid: "FOO" 

参考:http://edgeguides.rubyonrails.org/i18n.html#error-message-interpolation

関連する問題