【问题标题】:Ruby: multiple files, one "require" clauseRuby:多个文件,一个“require”子句
【发布时间】:2014-07-07 12:47:25
【问题描述】:

我将几个类封装到一个模块中,为它们创建命名空间,存储在一个文件my_namespace.rb中。

module MyNamespace
    class Class1
    end

    class Class2
    end

    class Class3
    end

    class Class4
    end

    class Class5
    end
end

这个模块被一个子句插入:

require 'my_namespace'

这个模块现在已经很臃肿了,所以我想将命名空间拆分到 lib 文件夹中的几个 *.rb 文件 - 每个类一个文件,但恐怕它需要使用几个 require 子句 - 一个每班。如何保留一个require 子句? (或者更准确地说:require、include 或任何允许我使用我的类的东西)

【问题讨论】:

    标签: ruby-on-rails namespaces include partial-classes


    【解决方案1】:

    您可以通过首先查看文件夹在加载时生成您的 require 调用。例如

    Dir[File.join(Rails.root, "path/to/directory/*.rb")].each {|file| require file }
    

    因此,如果您的所有文件都在“/path/to/directory”文件夹中,那么它们都是必需的。

    有些人喜欢从 require 末尾删除“.rb”部分,在这种情况下你会这样做

    Dir[File.join(Rails.root, "path/to/directory/*.rb")].each {|file| require file.gsub(/\.rb$/,"") }
    

    编辑 - 将路径更新到 rails 项目文件夹内,因为它们可能会在某个地方。在上面的例子中,我假设他们在<your project folder>/path/to/directory

    在使用继承时,这种方法存在潜在风险,因为文件的列出顺序可能与继承所需的顺序不同。即使您设法命名文件以便在 Windows 中进行继承,Linux 也可能以不同的顺序对文件进行排序,这将破坏您的所有努力。在这种情况下,建议使用文件名数组。

    【讨论】:

    • 我应该在哪里做这个?在某些基础文件中执行此操作是否足以让主应用程序代码只需要此基础文件?
    • 是的,把它放在config/application.rb
    • 不错的建议,但我想到了可以单独包含并包含所有需求的包的一些“根模块”。我认为一个包不是一个应用程序,而是 lib 子文件夹中的一堆文件。
    • Rails.rootnilconfig/application.rb 的开头。要利用它,需要在 class Application < Rails::Application 之后定义循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多