Ruby 已经在使用我的模型的类名

Posted

技术标签:

【中文标题】Ruby 已经在使用我的模型的类名【英文标题】:Ruby is already using the class name of my model 【发布时间】:2011-02-11 06:25:06 【问题描述】:

我正在制作一个具有各种授权级别的论坛应用程序,其中之一是 Monitor。我通过扩展我的 User 类来做到这一点,并且我计划使用“-ship”类(例如管理员、作者、主持人等)对其进行微调。显然 Monitor 类是 ruby​​ mixin 的一部分。如何在不发生冲突的情况下保留资源名称?

【问题讨论】:

【参考方案1】:

在其他模块中声明你的 Monitor 类。

module MyModule

  class Monitor

  end

end

【讨论】:

如果您要对类进行命名空间,则不需要 MyModule:: 并将这个文件放到app/models/my_module/monitor.rb我应该对所有用户孩子都这样做吗?另外,模块类不应该从 User 继承吗(例如 class Monitor @ryan 所以假设我要调用这个模块层次结构,你告诉我把我的模型放在 app/models/hierarchy/monitor.rb 中,这会起作用吗?如果在模块中定义了这个文件,为什么我还需要这个文件?【参考方案2】:

一些可能性:

避免在标准 Monitor 实例中调用 require 'monitor.rb' 使用一些运行时魔法来重命名现有的 Monitor 类。 monkey 与您的加载路径,以便require 'monitor.rb' 拉入 Monitor 的空实现。

但在所有情况下,您最终都可能遇到第 3 方库使用 Monitor 并期望它是标准 Monitor 类的情况。所以,我建议不要使用上述任何一种。

我想说你唯一的两个合理的选择是:

A) 你可以把你的类放在一个命名空间中:

Module MyApp
  class Monitor
    #...
  end
end

如果您的应用程序使用某种自动请求魔法(例如它是一个 Rails 应用程序),那么您可以将您的实现放在 /my_app/monitor.rb 中。当您想引用该类时,您可以执行my_monitor = MyApp::Monitor.new() 之类的操作。

B) 你可以使用不同的类名:)

【讨论】:

如上所述 (MyModule::),在实现这些类之后,我将如何引用它们?我之前读过一些关于模块和 mixin 的文章,但我从未使用过我在应用中制作的自定义模块。 我编辑了我的答案以包含有关命名空间方法的更多详细信息。希望这能让你更清楚。 很好,我也喜欢建议 B...我会试试这个,如果成功就接受。 Tony 好像不对。新模块在级联中不优先。选项 B 看起来越来越好......【参考方案3】:

仅供参考,我刚刚找到了一个巧妙的技巧(错误,hack)来解决这个问题。

我在一个大型遗留应用程序上工作,不幸的是,它有一个“夹具”模型,它非常重要并且到处都在使用。运行测试时,由于 ActiveRecord 在运行测试时使用了 Fixture 类,因此无法创建 Fixture 实例。所以我做了以下事情:

FixtureModel = Fixture.dup

这将我的类冻结在适当的位置,以便我以后可以引用它(但只是在我的测试中!)而不会被 ActiveRecord Fixture 类(未命名空间)扩展

【讨论】:

以上是关于Ruby 已经在使用我的模型的类名的主要内容,如果未能解决你的问题,请参考以下文章

在 ruby​​ link_to 标记中添加多个类名

为啥模型在管理员 Django 中有父类名

如何将类名作为变量传递给ruby中的另一个类

了解 Ruby on Rails 6 中的路由 + 模块/类名称 [以及在此上下文中模块是啥]

CSS 显示模板类名中的额外空格

具有动态类名的 PHP 命名空间