我开始创建一个应用程序,并规划了我的基本搭建。让我们假设我创建了以下资源:
rails g scaffold CircusAnimal fieldOne:string fieldTwo:string
我使用Rails I18n来翻译表单上的标签,使用的代码是:
en:
activerecord:
attributes:
circus_animal:
fieldOne: Breed
fieldTwo: Trainer
到目前为止一切顺利,当我生成一个包含模型的所有字段的表单时,翻译都被正确地选取了:
<%= form.fields_for :circus_animals do |f| %>
<%= f.label :fieldOne %>
<%= f.text_field :fieldOne %>
<%= f.label :fieldTwo %>
<%= f.text_field :fieldTwo %>
<% end %>
然后,我决定在此表单中再添加一个字段,于是运行了迁移:
rails g migration add_fieldThree_to_circusAnimal fieldThree:integer
rails db:migrate
我将新字段添加到控制器中的允许字段中,并将其添加到视图中。
<%= form.fields_for :circus_animal do |f| %>
<%= f.label :fieldOne %>
<%= f.text_field :fieldOne %>
<%= f.label :fieldTwo %>
<%= f.text_field :fieldTwo %>
+ <%= f.label :fieldThree %>
+ <%= f.number_field :fieldThree %>
<% end %>
我还在en.yml
中添加了一个翻译:
en:
activerecord:
attributes:
circus_animal:
fieldOne: Breed
fieldTwo: Trainer
+ fieldThree: Age
但是fieldThree
的标签没有被翻译,我试过删除资产,试过运行rails db:schema:cache:clear
,试过在rails控制台中运行:
CircusAnimal.connection.schema_cache.clear!
CircusAnimal.reset_column_information
如果我运行CircusAnimal.columns
,我会正确地看到fieldThree
列。
如何使新添加的字段像最初搭建的前两个字段一样进行翻译?
1条答案
按热度按时间mrwjdhj31#
我的错,我知道发生了什么。有问题的资源(我们称之为
CircusAnimal
)属于其他资源(我们称之为Circus
),因此CircusAnimal
的表单字段包含在Circus
资源的视图页面上,沿着Circus
表单字段。我在Circus
资源的视图上添加了:fieldThree
,而没有在CircusAnimal
资源的视图上添加:因此,我的自定义i18n-tasks
扫描程序将:fieldThree
与Circus
资源关联,而不是与CircusAnimal
资源关联。为了解决这个问题,我只需要将:fieldThree
添加到CircusAnimal
的视图中,扫描程序就会将其选中并正确地与CircusAnimal
关联。现在,当我在正确的资源下将其转换为en.yml
时,视图中正确显示了翻译。对不起,愚蠢的错误!我在rails控制台中尝试使用I18n.t('activerecords.attributes.circus_animal.fieldThree')
进行翻译时发现了这个问题,但我得到了一个错误,即缺少翻译键。这让我注意到该键位于错误的资源下,因为它是从Circus
资源的视图中获得的!