Rails i18n - 如何翻译模型的枚举

jba*_*sta 3 enums localization ruby-on-rails internationalization ruby-on-rails-5

我有以下型号:

class Person < ActiveRecord::Base
  enum gender: [:female, :male]
  ...
end
Run Code Online (Sandbox Code Playgroud)

然后我将性别选择添加到其表单中,如下所示:

<%= form_for ([@person]) do |f| %>
  ...
  <div class="form-group">
    <%= f.collection_radio_buttons :gender, Person.genders, :first, :first %>
  </div>
  ...
<% end %>
Run Code Online (Sandbox Code Playgroud)

但不是将常量显示为字符串,而是将其翻译为葡萄牙语.

我已经尝试将它添加到人们的pt.yml文件中但是没有用.

pt:
 activerecord:
   attributes:
     female: Feminino
     male: Mascúlino
Run Code Online (Sandbox Code Playgroud)

我知道这个问题非常类似于如何使用i18n和Rails 4枚举,但这个问题已经标记为已回答,我正在寻找更好,更简单的解决方案......

感谢您抽出宝贵时间帮助我:)

jba*_*sta 8

阅读如何使用i18n与Rails 4枚举答案更仔细我来到这个解决方案:

  1. 根据rails指南 - "如果您需要访问给定模型中的嵌套属性,则应将它们嵌套在转换文件的模型级别的model/attribute下" -

yml文件应如下所示:

pt:
 activerecord:
   attributes:
     person/gender:
       female: Feminino
       male: Mascúlino
Run Code Online (Sandbox Code Playgroud)
  1. 我们需要创建一个返回翻译的方法,enum因为没有任何方法能够立即翻译整个翻译enum.Rails只有翻译给定键的值的方法,即People.human_attribute_name("gender.female").

好的,我们将创建一个新方法,但我们应该把它放在哪里?

我认为这Helpers是最好的地方,因为我正在改变枚举值,以便轻松地将它们附加到form collection,尽管大多数答案建议将它放入Models.

现在我person_helper.rb看起来像这样:

def human_attribute_genders
  Hash[Person.genders.map { |k,v| [k, Person.human_attribute_name("gender.#{k}")] }]
end
Run Code Online (Sandbox Code Playgroud)

我的view:

<%= f.collection_radio_buttons :gender, human_attribute_genders, :first, :second %>
Run Code Online (Sandbox Code Playgroud)

很简单,它工作得很好!

如果有人有任何改进我的解决方案的建议,我很乐意听到你的意见:)

例如,我可以提取方法来application_helper.rb像这样:

def human_attribute_enum(model_name, enum_attr, attr_name)
  Hash[enum_attr.map { |k,v| [k, I18n.t("activerecord.attributes.#{model_name}/#{attr_name}.#{k}")] }]
end
Run Code Online (Sandbox Code Playgroud)

但它需要在view...中传递大量参数