【发布时间】:2013-02-15 00:37:41
【问题描述】:
我的理解
假设我有一个带有方便验证的类,例如:
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 在 en.yml 中搜索字符串时会查找 UserSubclassOne 到 User 的层次结构,然后注意它何时被“命中”,但是(除非我做了什么可怕的错误)显然这不会发生。
一个明显的解决方案是将en.yml.en.errors.models 中的数据复制为user、user_subclass_one、user_subclass_two 等,但我的Rails-sense 告诉我这是非常错误的。
各位,有什么想法吗?
潜在并发症:
User 定义在一个 gem MyGem 中,它包含在 Rails 引擎中 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!'
还有宾果游戏!
【问题讨论】:
标签: ruby-on-rails validation inheritance i18n-gem rails-i18n