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')

您也可以将本地文件中的键“范围”到操作和控制器

于 2012-08-14T04:06:15.877 回答