我正在尝试为我的应用创建自定义例外。我的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
你知道我可能做错了什么吗?我很擅长创建自己的库,所以我确定我误解了一些东西。
答案 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
的文件,然后您才能访问其中定义的其他类。
解决方案是为异常创建单独的文件或打开此目录的热切加载。