gpt4 book ai didi

ruby-on-rails - 跨模块的类名冲突

转载 作者:数据小太阳 更新时间:2023-10-29 08:58:43 25 4
gpt4 key购买 nike

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

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

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

> Event
=> Event(id: integer...)

示例 #2:当首先引用 LibModule::Event 时:

> LibModule::Event
=> LibModule::Event
> Event
=> LibModule::Event

因此,当我的服务器重新启动时(更新后等),如果用户参与触发服务器事件的行为类似于示例 #2,我偶尔会收到以下错误:

superclass mismatch for class Event

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

  1. 我尝试使用 gems 中的类名复制示例 #2 中的行为,看起来 Rails 完全隔离了 gems 中的类。有没有办法在这里做同样的事情?我认为这将是我的理想情况。
  2. 我应该只更改 LibModule::Event 的名称吗?
  3. 我应该确保 ActiveRecord 类在初始化期间加载吗?
  4. 其他一些我没有想到的 Rails 最佳实践?

最佳答案

这与 the way qualified constants are resolved by the Rails autoloader 有关.该文档提供了以下解决方案:

Naming conflicts of this kind are rare in practice, but if one occurs, require_dependency provides a solution by ensuring that the constant needed to trigger the heuristic is defined in the conflicting place.

在您的情况下,解决方案是将其添加到 LibModule::Event 的类定义之上:

require_dependency 'event'

这将通知自动加载器引用您的 ActiveRecord 模型的 ::Event 常量,确保为 LibModule::Event 适当命名常量。

关于ruby-on-rails - 跨模块的类名冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41988708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com