5

次の設定を検討してください。

#app/models/user.rb
class User > ActiveRecord::Base
  attr_accessible :login, :options
  serialize :options, OpenStruct
end

#app/views/users/_form.html.erb
form_for @user do |f|
  f.label :login
  f.fields_for :options, @user.options do |options|
    options.label :emailme
  end
end 

#config/locals/en.yml
  en:
    activerecord:
      attributes:
        user: 
          login: "User Name"
          options: 
            emailme: "Email Preference"

私が解決しようとしている問題は、シリアル化された属性「オプション」の属性 (:emailme) のラベル タグをローカライズできることです。

Rails ソースを深く掘り下げたところ、問題は options.label を呼び出すときにオブジェクトがあると想定されているためであることがわかりましたが、渡されるオブジェクト名が "user[options" であるため、オブジェクトがありません。 ] であり、有効なインスタンス変数名ではありません。

オブジェクトを取得するRails github の form_helper.rb の 1124 行を参照してください。object_name が item[subobject] の場合、nil にフォールバックすることさえ言及しているコメントがあります。

そのため、実際のラベルLine 1110 form_helper.rbを作成しようとすると、デフォルトで method_name.humanize になります。

シリアル化された属性を使用してローカライズを達成する適切な方法はありますか?

4

2 に答える 2

4

または、次のように i18n ヘルパーを使用できることを発見しました (フォームを変更する必要はありません)。

 en:
   helpers:
   label:
    "user[options]":
       emailme: "Email Preference"

これはまだ検証メッセージをカバーしていませんが...

于 2012-08-14T09:12:08.757 に答える
0

独自のキーを作成し、明示的に I18n.translate を呼び出したいと思いますか?

http://guides.rubyonrails.org/i18n.htmlを参照

# config/locals/en.yml
en:
  users:
    email_preference: "Email Preference"

# app/views/users/_form.html.erb
form_for @user do |f|
  f.label :login
  f.fields_for :options, @user.options do |options|
    options.label :emailme, I18n.translate('users.email_preference')
  end
end 

警告: テストされていないコード

既存の構成を使用して動作する可能性がありますか?I18n.translate('activerecord.attributes.user.options.emailme')

また、locals ファイルのキーをアクションとコントローラーに「スコープ」することもできます

于 2012-08-14T04:06:15.877 に答える