我的理解
假设我有一个带有方便验证的类,例如:
User < ActiveRecord::Base
validates :username, :format => {/regex/}, :message => :name_format
end
在这种情况下,我可以i18n
通过在我的 中包含以下内容来使错误消息可翻译/config/locals/en.yml
:
en:
activerecord:
errors:
models:
user:
attributes:
username:
name_format: 'has the way-wrong format, bro!'
这很好,通常非常方便。
我想知道的:
我的问题是:当我有从 User 继承的子类时会发生什么:
UserSubclassOne < User
# extra stuff
end
UserSubclassTwo < User
# extra stuff
end
...
UserSubclassEnn < User
# extra stuff
end
现在的问题是 Rails 找不到翻译user_subclass_one.attributes.username.name_format
。
它抱怨:
translation missing:
en.activerecord.errors.models.user_subclass_one.attributes.username.name_format
我希望 Rails在搜索字符串时查找UserSubclassOne
to的层次结构,然后注意它何时被“命中”,但是(除非我做错了什么)显然这不会发生。User
en.yml
一个明显的解决方案是复制en.yml.en.errors.models
for user
、user_subclass_one
、user_subclass_two
等中的数据,但我的 Rails 感觉告诉我这是大错特错。
有什么想法吗,伙计们?
潜在并发症:
User
MyGem
在包含在 Rails 引擎中的 gem 中定义,该引擎包含在定义, ...,MyEngine
的完整 Rails 应用程序中。不过,我认为这并不重要,因为验证正在运行,这是文件所在的位置——只是想让人们知道,以防万一。MyApp
UserSubclassOne
UserSubclassEnn
MyGem::User
en.yml
终极问题/解决方案:
所以事实证明问题出在命名空间上。回想一下MyApp
(定义UserSubclassOne
)使用MyGem
(定义User
)。原来User
实际上是在命名空间中MyGem
(不一定总是这样),所以开头的完整声明行User
不是:
User < ActiveRecord::Base
反而
MyGem::User < ActiveRecord::Base
.
当 i18n gem 查找类层次结构时,它会注意到这个命名空间并搜索my_gem/user
,而不是简单地user
、my_gem.user
、my_gem: user
等。
因此我不得不将我的en.yml
文件更改为
/config/locals/en.yml
:
en:
activerecord:
errors:
models:
my_gem/user:
attributes:
username:
name_format: 'has the way-wrong format, bro!'
和宾果游戏!