Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 模块之间的类名冲突_Ruby On Rails_Ruby_Ruby On Rails 4_Activerecord - Fatal编程技术网

Ruby on rails 模块之间的类名冲突

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

我在Rails 4应用程序中遇到了一个与类名和模块相关的问题

我的主应用程序中有一个继承自
ActiveRecord::Base
事件
类。我在/lib目录中还有一组文件,它们被分组到一个我称之为
LibModule
的模块中。该模块中有一个类也被命名为
Event
。我注意到引用这些类的一些有趣之处。下面是一些使用Rails控制台的示例

示例#1:当事件从未被引用时,将加载ActiveRecord版本:

> Event
=> Event(id: integer...)
示例#2:首先引用LibModule::Event时:

> LibModule::Event
=> LibModule::Event
> Event
=> LibModule::Event
因此,当我的服务器重新启动时(在更新等之后),如果用户从事类似于示例2的触发服务器活动的行为,我偶尔会遇到以下错误:

我知道有几种方法可以确保这里没有冲突。处理这种情况的最佳做法是什么

  • 我尝试用gems中的类名复制示例2中的行为,看起来Rails完全隔离了gems中的类。这里有没有同样的方法?我想这是我的理想状态
  • 我是否应该更改
    LibModule::Event
    的名称
  • 我是否应该确保在初始化期间加载
    ActiveRecord
  • 我没有想到的其他Rails最佳实践

  • 虽然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'