如何用Rails i18n翻译模型中的枚举值?

2026-04-10 07:321阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计628个文字,预计阅读时间需要3分钟。

如何用Rails i18n翻译模型中的枚举值?

我有以下代码:

rubyclass Person ActiveRecord::Base enum gender: [:female, :male]end

然后我将性别选择添加到表单中,如下所示:%=form_for([@person]) do |f| div class=form-group

简化后:

rubyclass Person

将性别选择添加到表单:%=form_for(@person) do |f| div class=form-group

我有以下型号:

class Person < ActiveRecord::Base enum gender: [:female, :male] ... end

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

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

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

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

pt: activerecord: attributes: female: Feminino male: Mascúlino

我知道这个问题与How to use i18n with Rails 4 enums非常相似,但这个问题已经标记为已回答,我正在寻找更好,更简单的解决方案……

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

在仔细阅读了 How to use i18n with Rails 4 enums个答案之后,我找到了这个解决方案:

>根据rails guides – “如果您需要访问给定模型中的嵌套属性,您应该将它们嵌套在您的翻译文件的模型级别的模型/属性下” –

yml文件应如下所示:

如何用Rails i18n翻译模型中的枚举值?

pt: activerecord: attributes: person/gender: female: Feminino male: Mascúlino

>我们需要创建一个返回翻译枚举的方法,因为没有任何方法可以一次翻译整个枚举. Rails只有翻译给定密钥的值的方法,即People.human_attribute_name(“gender.female”).

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

我认为Helpers是放置它的最佳位置,因为我正在更改枚举值以便轻松地将它们附加到表单集合,尽管大多数答案都建议将它放在模型中.

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

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

我的观点是:

<%= f.collection_radio_buttons :gender, human_attribute_genders, :first, :second %>

很简单,它工作得很好!

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

例如,我可以像这样将方法提取到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

但它需要在视图中传递很多参数……

本文共计628个文字,预计阅读时间需要3分钟。

如何用Rails i18n翻译模型中的枚举值?

我有以下代码:

rubyclass Person ActiveRecord::Base enum gender: [:female, :male]end

然后我将性别选择添加到表单中,如下所示:%=form_for([@person]) do |f| div class=form-group

简化后:

rubyclass Person

将性别选择添加到表单:%=form_for(@person) do |f| div class=form-group

我有以下型号:

class Person < ActiveRecord::Base enum gender: [:female, :male] ... end

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

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

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

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

pt: activerecord: attributes: female: Feminino male: Mascúlino

我知道这个问题与How to use i18n with Rails 4 enums非常相似,但这个问题已经标记为已回答,我正在寻找更好,更简单的解决方案……

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

在仔细阅读了 How to use i18n with Rails 4 enums个答案之后,我找到了这个解决方案:

>根据rails guides – “如果您需要访问给定模型中的嵌套属性,您应该将它们嵌套在您的翻译文件的模型级别的模型/属性下” –

yml文件应如下所示:

如何用Rails i18n翻译模型中的枚举值?

pt: activerecord: attributes: person/gender: female: Feminino male: Mascúlino

>我们需要创建一个返回翻译枚举的方法,因为没有任何方法可以一次翻译整个枚举. Rails只有翻译给定密钥的值的方法,即People.human_attribute_name(“gender.female”).

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

我认为Helpers是放置它的最佳位置,因为我正在更改枚举值以便轻松地将它们附加到表单集合,尽管大多数答案都建议将它放在模型中.

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

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

我的观点是:

<%= f.collection_radio_buttons :gender, human_attribute_genders, :first, :second %>

很简单,它工作得很好!

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

例如,我可以像这样将方法提取到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

但它需要在视图中传递很多参数……