次の設定を検討してください。
#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 になります。
シリアル化された属性を使用してローカライズを達成する適切な方法はありますか?