使用自定义异常时未初始化的常量

时间:2013-12-25 23:02:52

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

我正在尝试为我的应用创建自定义例外。我的libs文件夹中有一个示例库,其文件夹结构如下:

- lib/
|
|--social/
  |
  |-- bandcamp.rb

bandcamp.rb文件内容如下所示:

module Social
  class ExampleException < Exception; end

  class Bandcamp
    def some_method()
    end
  end
end

问题是,我可以在我的应用中的任何地方使用Social::Bandcamp.new.some_method,它工作得很好,但我无法访问Social::ExampleException,也无法在任何地方提升它。它给了我

NameError: uninitialized constant Social::ExampleException

你知道我可能做错了什么吗?我很擅长创建自己的库,所以我确定我误解了一些东西。

2 个答案:

答案 0 :(得分:4)

你可能被Rails类的急切加载所困扰。为什么?参见:

2.0.0p353 :001 > Social.constants
 => [] 
2.0.0p353 :002 > raise Social::ExampleException
NameError: uninitialized constant Social::ExampleException
2.0.0p353 :003 > Social::Bandcamp
 => Social::Bandcamp 
2.0.0p353 :004 > Social.constants
 => [:ExampleException, :Bandcamp] 
2.0.0p353 :005 > raise Social::ExampleException
Social::ExampleException: Social::ExampleException

如果您想要更改该行为,您应该打开急切加载的lib目录(默认情况下只加载app),为此添加到您的environment.rb(或具体环境设定):

  config.eager_load_paths += %W(#{config.root}/lib)

答案 1 :(得分:3)

此处的问题是lib/文件是自动加载的(config.autoload_paths)。 自动加载取决于文件名,以便找到所需的类。 只有在您调用bandcamp.rb时才会加载名为Social::Bandcamp的文件,然后您才能访问其中定义的其他类。

解决方案是为异常创建单独的文件或打开此目录的热切加载。