我们目前正在为ROR 3.2开发自定义cms引擎。在这个过程中,我们希望在rails应用程序中成为一等公民,这意味着它们应该位于应用程序的app文件夹下,并且它是插件。
目前我们有以下类型:
我在app文件夹下创建了多个目录来保存这些目录:
会有更多类型,我有点担心用这么多目录污染app文件夹。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含由cms定义的所有类型。
所有类都应位于 MyCms 命名空间内,目录布局应如下所示:
但是现在我遇到了自动加载问题,因为rails默认自动加载会检测到这样的路径:
但是这样我就不会将所有对象类型分组到一个目录中。
我想要的有点类似于查看隔离引擎的分组。例如,在Devise中,所有视图都分组在views / devise子目录中。
知道如何在没有太多自定义实现的情况下实现这一目标吗?
答案 0 :(得分:9)
您必须将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
您可以将app文件夹添加到加载路径:
config.autoload_paths << "#{config.root}/app"
或者,您可以手动执行此操作,但在Rails开发中丢失了对这些类的重新加载:
在app / my_cms.rb中(以及适用于app的自动加载):
module MyCms
autoload :AnotherDataSource, 'my_cms/data_source/one_data_source'
autoload :AnotherDataSource, 'my_cms/data_source/another_data_source'
...
end