2012-01-20 5 views
4

I18Nで問題なくモデル検証から選択タグを作成できますか?I18Nで検証オプションから選択タグを生成

モデル::私はこのようなモデルがあった場合

は、例えばどのように私は、この言語を独立させることができ

<%= f.label :size %><br /> 
<%= select(:coffee, :size, Coffee::SIZES.collect {|d| [d, d]}) %> 

class Coffee < ActiveRecord::Base 
    SIZES = [ "small", "medium", "big" ] 
    validates :size, :inclusion => { :in => SIZES, 
    :message => "%{value} is not a valid size" } 
end 

を形成?

答えて

4

検証メッセージi18nを独立させようとしている場合は、実際に無効なサイズを指定する必要はありません。 HTMLの選択フォームを渡しています。別のサイズを選択した場合は、何かをする可能性が高いため、正確なエラーメッセージは不要です。

選択テキスト自体については、それをi18nシステムに渡して、それを処理することができます。配列をCoffee::SIZE.collect {|d| [t(".#{d}"), d]}で構築すると、そのビューのi18nファイルにsmallmediumbigを追加して、検証オプションに基づいてローカライズされた値を得ることができます。

5

これを処理する最善の方法は、UIのDBおよびローカライズされたラベルにロケールに依存しない値を設定することです。ロケールファイルを

<%= select(:coffee, :size, Coffee::SIZES.collect {|d| [I18n.t(d), d]}) %> 

し、あなたにそれを持つ:あなたはそのようなあなたの選択のためのオプションを変更してそれを達成することができます

そのようなHTMLが生成されます
some-language: 
    small: "small-translation" 
    medium: "medium-translation" 
    big: "big-translation" 

<select name="coffee[size]"> 
    <option value="small">small-translation</option> 
    <option value="medium">medium-translation</option> 
    <option value="big">big-translation</option> 
</select> 

ユーザーをselectではローカライズされたオプションが表示されますが、リクエストパラメータではロケールに依存しない値がポストされるため、検証は正しく動作します。

関連する問題