【问题标题】:How to load stuff in /lib in a thread safe way?如何以线程安全的方式在 /lib 中加载东西?
【发布时间】:2013-12-12 07:36:57
【问题描述】:

我尝试了config.autoload_paths += Dir["#{config.root}/lib/**/"]config.eager_load_paths += Dir["#{config.root}/lib/**/"],但不断收到uninitialized constant 错误。

我认为这与 dependency_loading 被禁用有关,因为 config.threadsafe! 现在是 Rails 4 中的默认设置。

那么从 /lib 目录急切/自动加载内容的正确方法和线程安全方法是什么?

更新:/lib 结构

lib/car.rb:

module Car
  CAR_TYPES = %w[volvo saab]
end

lib/car/volvo.rb:

module Car
  class Volvo
  end
end

抛出的错误是NameError (uninitialized constant Car::CAR_TYPES)

更新 2:rails c:

Car.class 
=> Module
Car::CAR_TYPES
=> NameError: uninitialized constant Car::CAR_TYPES

更新 3:有趣的是,Car::Volvo.new 有效,但 Car::CAR_TYPES 无法引用。

【问题讨论】:

  • 您能否详细说明uninitialized constant 错误?您确定遵循所有约定以允许加载常量吗?
  • @gmile:更新了更多细节。请注意,我使用的是rails-api

标签: ruby-on-rails-4 autoload rails-api


【解决方案1】:

哎呀。我的应用程序实际上也被称为 Car 并且奇怪的是命名空间已经在使用 Car.constants => [:Application]。将module Car 更改为其他内容可以解决问题,并且我可以再次引用Cars::CAR_TYPES

由于Car 已经定义(在application.rb 中),自动加载甚至不会尝试加载lib/car.rb。详细解释请见https://stackoverflow.com/a/6797707/377920

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2023-03-31
    • 2011-07-08
    • 2023-03-11
    • 2015-12-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多