Ruby on rails 模块之间的类名冲突
我在Rails 4应用程序中遇到了一个与类名和模块相关的问题 我的主应用程序中有一个继承自Ruby on rails 模块之间的类名冲突,ruby-on-rails,ruby,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Activerecord,我在Rails 4应用程序中遇到了一个与类名和模块相关的问题 我的主应用程序中有一个继承自ActiveRecord::Base的事件类。我在/lib目录中还有一组文件,它们被分组到一个我称之为LibModule的模块中。该模块中有一个类也被命名为Event。我注意到引用这些类的一些有趣之处。下面是一些使用Rails控制台的示例 示例#1:当事件从未被引用时,将加载ActiveRecord版本: > Event => Event(id: integer...) 示例#2:首先引用Li
ActiveRecord::Base
的事件
类。我在/lib目录中还有一组文件,它们被分组到一个我称之为LibModule
的模块中。该模块中有一个类也被命名为Event
。我注意到引用这些类的一些有趣之处。下面是一些使用Rails控制台的示例
示例#1:当事件从未被引用时,将加载ActiveRecord版本:
> Event
=> Event(id: integer...)
示例#2:首先引用LibModule::Event时:
> LibModule::Event
=> LibModule::Event
> Event
=> LibModule::Event
因此,当我的服务器重新启动时(在更新等之后),如果用户从事类似于示例2的触发服务器活动的行为,我偶尔会遇到以下错误:
我知道有几种方法可以确保这里没有冲突。处理这种情况的最佳做法是什么
LibModule::Event
的名称李>
ActiveRecord
类虽然Ruby中没有任何东西可以阻止您使用重复的类名,但是Rails自动加载程序确实很容易被它们弄糊涂,这会导致很多问题 由于这个原因,我通常会不遗余力地避免重复。有时它们工作,有时不工作,代码的工作/不工作方面通常取决于采用哪个入口点,首先加载哪些内容,从而使其不可预测 您可以尝试通过在
lib\u模块的末尾使用require\u relative
强制加载事件
类来避免这种情况。rb
这与此有关。本文档提供了以下解决方案:
这种命名冲突在实践中很少见,但如果发生冲突,require\u dependency
通过确保在冲突位置定义触发启发式所需的常量来提供解决方案
在您的例子中,解决方案是将其添加到LibModule::Event
的类定义之上:
require_dependency 'event'
这将通知自动加载程序引用ActiveRecord模型的
::Event
常量,确保为LibModule::Event
指定适当的常量名称以引用主事件类try::Event
:
是一个作用域解析运算符,用于指定全局/主作用域。这是一个非平凡且有些不直观的区域。注意:文件明确规定不要做您建议的事情:
require_dependency 'event'