考虑这个设置:
#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"
我正在尝试解决的问题是能够为序列化属性“options”的属性(:emailme)本地化label标签。
我已深入挖掘rails源并发现问题是因为当我调用options.label时它期望有一个对象,但没有对象,因为传递的对象名称是“user [options“]并且这不是有效的实例变量名。
请参阅line 1124 of form_helper.rb on rails github检索对象的位置。有一条评论甚至提到当object_name是item [subobject]时回退到nil。
所以,当它创建实际标签Line 1110 form_helper.rb时,它默认为method_name.humanize
有没有合适的方法来完成序列化属性的本地化?
答案 0 :(得分:4)
或者,我发现我可以像这样使用i18n助手(而不必更改表格中的任何内容):
en:
helpers:
label:
"user[options]":
emailme: "Email Preference"
虽然这仍然不包括验证消息......
答案 1 :(得分: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')
您也可以将本地文件中的密钥“范围”到操作和控制器