【问题标题】:Rails I18n with serialized attributes using fields_for使用 fields_for 具有序列化属性的 Rails I18n
【发布时间】:2012-08-14 02:24:00
【问题描述】:

考虑这个设置:

#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 时,它期望有一个对象,但是没有对象,因为传递下来的对象名称是“用户[options"] 这不是一个有效的实例变量名。

查看line 1124 of form_helper.rb on rails github 检索对象的位置。有一条评论甚至提到当 object_name 为 item[subobject] 时回退到 nil。

因此,当它创建实际标签 Line 1110 form_helper.rb 时,它默认为 method_name.humanize

有没有什么体面的方法来完成序列化属性的本地化?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 internationalization


    【解决方案1】:

    另外,我发现我可以像这样使用 i18n 助手(而不必更改表单中的任何内容):

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

    虽然这仍然不包括验证消息...

    【讨论】:

      【解决方案2】:

      我认为您想创建自己的密钥并显式调用 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')

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

      【讨论】:

      • 这确实可行,但我正在寻找更多基于框架的解决方案。当框架行为不一致时,我总是很恼火,尤其是 ruby​​ on rails,因为它在其他方面非常灵活和可扩展。在属性范围内指定它的好处是验证错误消息将获得此转换。因此,为了使您的解决方案完全正常工作,我必须在两个地方指定基本相同的东西......不是很d.r.y.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      相关资源
      最近更新 更多