Ruby on rails 在子类中继承Rails i18n验证错误消息 我的理解

Ruby on rails 在子类中继承Rails i18n验证错误消息 我的理解,ruby-on-rails,validation,inheritance,i18n-gem,rails-i18n,Ruby On Rails,Validation,Inheritance,I18n Gem,Rails I18n,假设我有一个带有方便验证的类,如: User < ActiveRecord::Base validates :username, :format => {/regex/}, :message => :name_format end 这很好,而且通常非常方便 我想知道的是: 我的问题是:当我拥有从用户继承的子类时会发生什么: UserSubclassOne < User # extra stuff end UserSubclassTwo < User

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

User < ActiveRecord::Base
    validates :username, :format => {/regex/}, :message => :name_format
end
这很好,而且通常非常方便

我想知道的是: 我的问题是:当我拥有从用户继承的子类时会发生什么:

UserSubclassOne < User
    # extra stuff
end
UserSubclassTwo < User
    # extra stuff
end
...
UserSubclassEnn < User
    # extra stuff
end
class Admin < User
  validates :name, :presence => true
end
我希望Rails在
en.yml
中搜索字符串时,会查找
usersubcasone
User
的层次结构,然后注意到它何时被“命中”,但是(除非我做了一些可怕的错误)显然不会发生这种情况

一个明显的解决方案是复制
en.yml.en.errors.models
user
user\u subclass\u one
user\u subclass\u two
等的数据,但我的Rails感觉告诉我这是大错特错的

有什么想法吗,伙计们

潜在并发症:
User
在gem
MyGem
中定义,该gem包含在Rails引擎
MyEngine
中,该引擎包含在定义
usersubassone
,…,
usersubassenn
的完整Rails应用程序
MyApp
中。不过我认为这并不重要,因为验证是在
MyGem::User
中运行的,而
en.yml
文件就是在这里运行的——只是想让人们知道万一发生了这种情况

最终问题/解决方案:
因此,问题在于名称空间。回想一下
MyApp
(定义
usersubassone
)使用
MyGem
(定义
User
)。事实证明,
User
实际上位于名称空间
MyGem
(不一定总是这样),因此
User
开头的完整声明行不是:

User < ActiveRecord::Base
User < ActiveRecord::Base

宾果

根据关于活动记录验证错误消息的i18n Rails指南,您尝试执行的操作应该是:

考虑对name属性进行验证的用户模型,如下所示:

class User < ActiveRecord::Base
  validates :name, :presence => true
end
通过这种方式,您可以在模型继承链和属性、模型或默认范围的不同位置为各种错误消息提供特殊的翻译

因此,在您的情况下,假设您的类如下所示:

class User < ActiveRecord::Base
  validates :name, :presence => true
end
app/models/user.rb

User < ActiveRecord::Base
  validates :username, :format => {/regex/}, :message => :name_format
end
UserSubclass < User
  validates :username, :format => {/regex/}, :message => :name_format
end
然后,在
UserSubClass
上搜索验证的消息应该是:

activerecord.errors.models.user_sublcass.attributes.username.name_format # fail
activerecord.errors.models.user_sublcass.name_format                     # fail
activerecord.errors.models.user.attributes.username.name_format          # success
activerecord.errors.models.user.name_format
# ...

假设您的模型文件和yaml文件看起来类似于上述内容,那么您提到的潜在复杂性可能就是问题所在,但显然我不能确定。

因此,问题在于名称空间。回想一下
MyApp
(定义
usersubassone
)使用
MyGem
(定义
User
)。事实证明,
User
实际上位于名称空间
MyGem
(不一定总是这样),因此
User
开头的完整声明行不是:

User < ActiveRecord::Base
User < ActiveRecord::Base

宾果

+1为可靠参考!我会继续努力,看看是我把事情搞砸了,还是Rails没有按照承诺的那样运行。当问题解决后,如果合适的话,我会将这个答案标记为接受。因此,主要的问题确实是“潜在的复杂性”。
UserClass
的正确键应该是
my\u gem/user\u class
(而不是简单的
user\u class
,甚至
my\u gem.user\u class
)。这是一个很好的观点!您是否可以将此详细信息添加到您的问题中,以供其他有类似问题的人参考?另外,你可以把你的解决方案放在你的问题中(并接受这个答案),或者把它放在你自己的答案中并接受它。好的,保罗!谢谢你温柔的刺激;)迟来的感谢。我一直在拔头发。我知道它与名称空间相关,但如果没有此帮助,则无法加载错误。Rails引擎规范几乎毫无用处。他们完全忽略了这个相当重要的细节。
en:
  activerecord:
    errors:
      models:
        user:
          attributes:
            username:
              name_format: 'has the way-wrong format, bro!'
activerecord.errors.models.user_sublcass.attributes.username.name_format # fail
activerecord.errors.models.user_sublcass.name_format                     # fail
activerecord.errors.models.user.attributes.username.name_format          # success
activerecord.errors.models.user.name_format
# ...
User < ActiveRecord::Base
MyGem::User < ActiveRecord::Base
en:
    activerecord:
        errors:
            models:
                my_gem/user:
                    attributes:
                        username:
                            name_format: 'has the way-wrong format, bro!'