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
在gemMyGem
中定义,该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!'