继承Rails i18n子类中的验证错误消息

she*_*eac 5 validation inheritance ruby-on-rails i18n-gem rails-i18n

我的理解

假设我有一个方便的验证类,如:

User < ActiveRecord::Base
    validates :username, :format => {/regex/}, :message => :name_format
end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以i18n通过在我的包含中包含以下内容来使错误消息可翻译/config/locals/en.yml:

en:
    activerecord:
        errors:
            models:
                user:
                    attributes:
                        username:
                            name_format: 'has the way-wrong format, bro!'
Run Code Online (Sandbox Code Playgroud)

这很好,通常非常方便.

我想知道的:

我的问题是:当我有从User继承的子类时会发生什么:

UserSubclassOne < User
    # extra stuff
end
UserSubclassTwo < User
    # extra stuff
end
...
UserSubclassEnn < User
    # extra stuff
end
Run Code Online (Sandbox Code Playgroud)

现在的问题是Rails无法找到翻译user_subclass_one.attributes.username.name_format.

它抱怨说:

translation missing:
en.activerecord.errors.models.user_subclass_one.attributes.username.name_format
Run Code Online (Sandbox Code Playgroud)

我希望Rails会在搜索字符串时查找UserSubclassOne到的层次结构,然后注意它何时被"命中",但是(除非我做了一些可怕的错误)显然不会发生.Useren.yml

一个显而易见的解决办法是复制的数据en.yml.en.errors.modelsuser,user_subclass_one,user_subclass_two等,但我的Rails的常识告诉我,这是极其错误的.

任何想法,伙计们?

潜在的并发症:

UserMyGem包含在Rails引擎中的gem 中定义,该引擎MyEngine包含在MyApp定义了UserSubclassOne...... 的完整Rails应用程序中UserSubclassEnn.我不认为这应该是重要的,因为验证正在运行MyGem::User,这是en.yml文件所在的位置 - 只是想让人们知道,以防万一.

终极问题/解决方案:

事实证明问题是命名空间.回想一下MyApp(定义UserSubclassOne)使用MyGem(定义User).事实证明User它实际上是在命名空间中MyGem(这不一定总是如此),所以开头的完整声明行User不是:

User < ActiveRecord::Base
Run Code Online (Sandbox Code Playgroud)

反而

MyGem::User < ActiveRecord::Base
Run Code Online (Sandbox Code Playgroud)

.

当国际化的宝石查找的类层次结构,它注意到这个命名空间和搜索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!'
Run Code Online (Sandbox Code Playgroud)

和宾果游戏!

she*_*eac 6

事实证明问题是命名空间.回想一下MyApp(定义UserSubclassOne)使用MyGem(定义User).事实证明User它实际上是在命名空间中MyGem(这不一定总是如此),所以开头的完整声明行User不是:

User < ActiveRecord::Base
Run Code Online (Sandbox Code Playgroud)

反而

MyGem::User < ActiveRecord::Base
Run Code Online (Sandbox Code Playgroud)

.

当国际化的宝石查找的类层次结构,它注意到这个命名空间和搜索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!'
Run Code Online (Sandbox Code Playgroud)

和宾果游戏!