6

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

目前我们有以下类型:

  • 数据源
  • 数据类型
  • 看法

我在 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 子目录中。

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

4

1 回答 1

10

您必须将 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 中(并为应用程序自动加载):

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

  ...
end
于 2013-01-24T09:35:53.363 回答