在 Rails 上的模块之间共享类

Posted

技术标签:

【中文标题】在 Rails 上的模块之间共享类【英文标题】:Sharing classes between modules on Rails 【发布时间】:2021-05-05 08:36:45 【问题描述】:

我正在开发一个项目,使用 camunda-workflow 从 Rails 应用程序与 Camunda 进行通信。 camunda-workflow 通过将 Camunda 进程键映射到具有相同名称的模块,并将任务的 id 映射到类名来查找要执行的方法。

问题在于,对于两个密切相关的进程,它们共享大部分相同的任务,我需要有两个模块,每个模块都有几乎所有相同的类。为了避免这种情况,我想要么将一个模块中的类包含到另一个模块中,要么将父模块的类包含到两者中。

对于这些模块

module ModuleA
  class ClassA
    def my_method
      puts 'ModuleA, classA method'
    end
  end
end

module ModuleB
end

我需要能够打电话

ModuleB::ClassA.new.my_method

如何在模块之间共享这些通用类以避免重复?

【问题讨论】:

可能是include ModuleA in ModuleB? @iGian 我试过了,不行。 【参考方案1】:

我找到了一种使用 ActiveSupport::Concern 的方法

require "active_support/concern"

module ModuleA
  extend ActiveSupport::Concern
  included do
    class ClassA
      def module_a_class_a
        puts 'ModuleA, classA method'
      end
    end
  end
end

module ModuleB
  include ModuleA
end

现在我可以从 ModuleB 访问 ClassA 的方法了:

ModuleB::ClassA.new.module_a_class_a

【讨论】:

以上是关于在 Rails 上的模块之间共享类的主要内容,如果未能解决你的问题,请参考以下文章

Rails:在模型之间共享枚举声明值

在 Rails 和 Spring MVC 之间共享会话

在 Sinatra 和 Rails 之间共享 Yaml 配置文件

在多模块 maven 项目中的模块之间共享 src/test 类

在 Rails 中的子域之间共享会话(cookie)?

如何在两个模块之间共享数据库模型?