从应用程序中的自定义文件夹内的命名空间自动加载

roo*_*m13 5 ruby ruby-on-rails ruby-on-rails-3

我们目前正在为ROR 3.2开发一个自定义cms引擎.在这个过程中,我们想要成为rails应用程序中的一等公民,这意味着它们应该位于应用程序的app文件夹和它的插件之下.

目前我们有以下类型:

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

我在app文件夹下创建了多个目录来保存这些:

  • 应用程序/ DATA_SOURCE
  • 应用程序/ DATA_TYPE
  • 应用程序/视图

接下来会有更多类型,我有点担心用这么多目录污染app文件夹.因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含由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/devise子目录中.

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

mor*_*itz 9

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

config.autoload_paths << "#{config.root}/app/my_cms"
Run Code Online (Sandbox Code Playgroud)

假设您的类没有像这样的命名空间:

class DataSource
  ...
end
Run Code Online (Sandbox Code Playgroud)

如果你在app/my_cms/data_source.rb中将它们命名为:

class MyCms::DataSource
  ...
end
Run Code Online (Sandbox Code Playgroud)

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

config.autoload_paths << "#{config.root}/app"
Run Code Online (Sandbox Code Playgroud)

或者,您可以手动执行此操作但在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
Run Code Online (Sandbox Code Playgroud)