代码之家  ›  专栏  ›  技术社区  ›  pjb3

在Rails中向加载路径添加目录?

  •  62
  • pjb3  · 技术社区  · 16 年前

    从Rails2.3开始,向加载路径添加一个目录以便它与Rails的自动重新加载机制挂钩的正确方法是什么?

    我正在考虑的一个具体例子是,我有一个类,它有几个使用STI的子类,我认为最好将它们放在子目录中,而不是混乱的顶层。所以我想说:

    #app/models/widget.rb
    class Widget < ActiveRecord::Base
       add_to_load_path File.join(File.dirname(__FILE__), "widgets")
    end
    
    #app/models/widgets/bar_widget.rb
    class BarWidget < Widget
    end
    
    #app/models/widgets/foo_widget.rb
    class FooWidget < Widget
    end
    

    这是最重要的 add_to_load_path 我正在寻找的方法。

    8 回复  |  直到 16 年前
        1
  •  112
  •   Jamel Toms    7 年前

    在Rails的当前版本(3.2.8)中,application.rb文件中对此进行了更改。

      # Custom directories with classes and modules you want to be autoloadable.
      # config.autoload_paths += %W(#{config.root}/extras)
    

    价值试图修改前者 加载路径 变量导致此错误。

    /configuration.rb:85:in `method_missing': undefined method `load_paths' for #<Rails::Application::Configuration:0xac670b4> (NoMethodError)
    

    例如,对于要添加到自动加载路径配置的每个路径,添加一行类似于以下内容:

    config.autoload_paths += %W(#{config.root}/app/validators)
    

    config.autoload_paths 接受Rails将从中自动加载常量的路径数组。 默认情况下是所有目录下 app .

    http://guides.rubyonrails.org/configuring.html


    来自以下评论员(哈库宁):

    如果目录在 app/ ,您不需要在任何地方添加它,它应该在默认情况下工作(在3.2.12中肯定是这样)。Rails有 eager_load_paths 那就像 autoload_paths 在开发中,在生产中渴望负荷。 全部的 app/*

        2
  •  63
  •   Benjamin Bouchet    11 年前

    对于 旧版本 钢轨的长度:

    您可以在environment.rb配置文件中执行此操作。

    config.load_paths << "#{RAILS_ROOT}/app/widgets"
    

    对于 ,见下文答案

        3
  •  29
  •   Bergrebell    8 年前

    在里面 轨道5 您不再需要从应用程序目录中显式加载文件夹。所有放在里面的文件夹都可以直接使用。您不必触摸任何配置文件。但春天似乎有一些问题。

    因此,新的工作流程是:

    1. 在/app目录中创建新文件夹和类
    2. spring stop 在命令行上
    3. 使用检查自动加载路径 bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths' 在命令行上。现在应列出新文件夹。
    4. spring start 在命令行上
        4
  •  27
  •   Jared    14 年前

    在Rails 3中,您可以在config/application.rb中进行设置,默认情况下提供此示例:

    # Add additional load paths for your own custom dirs
    # config.load_paths += %W( #{config.root}/extras )
    
        5
  •  11
  •   Tiago Franco    9 年前

    # Add the widgets folder to the autoload path
    Rails.application.configure do
      config.autoload_paths << "#{Rails.root}/app/widgets"
    end
    
        6
  •  8
  •   songyy    8 年前

    而不是:

    ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets"
    

    您可能需要执行以下操作:

    ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/widgets"
    
        7
  •  1
  •   Lewis Hoffman    16 年前

    我发现我需要在配置块之后做这件事——再也不能访问配置对象了。

    这就成功了

    ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets"
    
        8
  •  1
  •   ajreal    6 年前

    在里面 config/application.rb 添加 config.autoload_paths << "#{config.root}/models/widgets" .

    module MyApp
      class Application < Rails::Application
        config.autoload_paths << "#{config.root}/models/widgets"
      end
    end
    

    我知道这适用于Rails 4和Rails 5。可能还有其他人。

        9
  •  0
  •   Dorian    4 年前

    如果要添加多个目录:

    config.autoload_paths += Dir[Rails.root / "components/*/app/public"]
    

    (这是packwerk自动加载的一个示例)

    推荐文章