轨道上的红宝石 - 从应用程序中自定义文件夹内的命名空间自动加载



我们目前正在为 ROR 3.2 开发自定义 cms 引擎。在这个过程中,产生了几种类类型,我们希望成为 rails 应用程序中的一等公民,这意味着它们应该驻留在应用程序及其插件的应用程序文件夹下。

目前我们有以下类型:

  • 数据源
  • 数据类型
  • 视图

我在应用程序文件夹下创建了多个目录来保存这些目录:

  • 应用/data_source
  • 应用/data_type
  • 应用/视图

更多的类型将随之而来,我有点担心用这么多目录污染应用程序文件夹。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含 cms 定义的所有类型。

所有类都应位于MyCms命名空间内,目录布局应如下所示:

  • 应用/my_cms/data_source
  • 应用/my_cms/data_type
  • 应用/my_cms/视图

但是现在我在自动加载时遇到了问题,因为 rails 默认自动加载会将路径显示为这样:

  • 应用/data_source/my_cms
  • 应用/data_type/my_cms
  • 应用/视图/my_cms

但是这样我就不会将所有对象类型分组到一个目录中。

我想要的有点类似于孤立引擎的视图分组。例如,在 Devise 中,所有视图都分组在 views/Design 子目录中。

知道如何在没有太多自定义实现的情况下实现这一目标吗?

您必须

将app/my_cms添加到config/application.rb中的自动加载路径中:

config.autoload_paths << "#{config.root}/app/my_cms"

前提是您的类是在没有命名空间的情况下定义的,如下所示:

class DataSource
  ...
end

如果您在 app/my_cms/data_source.rb 中像这样将它们命名为命名空间:

class MyCms::DataSource
  ...
end

您可以将应用文件夹添加到加载路径:

config.autoload_paths << "#{config.root}/app"

或者,您可以手动执行此操作,但在 Rails 开发中丢失了这些类的重新加载:

在 app/my_cms.rb 中(并具有应用自动加载功能):

module MyCms
  autoload :AnotherDataSource, 'my_cms/data_source/one_data_source'
  autoload :AnotherDataSource, 'my_cms/data_source/another_data_source'
  ...
end

相关内容

  • 没有找到相关文章

最新更新