我何时何地需要rails应用程序中的文件?

假设我的rails应用程序的lib目录中有以下文件:

#lib/proxy.rb module SomeService class ServiceProxy def do_something end end end 

如果我想在模型中使用ServiceProxy,我可以像这样使用它:

 #app/models/product.rb require 'proxy' class Product < ActiveRecord::Base def do_something proxy = SomeService::ServiceProxy.new proxy.do_something end end 

这有效,但我注意到如果我想在另一个模型中使用ServiceProxy,我在第二个模型文件中不需要“require’proxy’”。 似乎在任何模型中都有“require’proxy’”,它会将它添加到查找路径中。

有人可以在rails应用程序中解释这种行为以及围绕它的最佳实践吗?

谢谢!

更新:根据下面的floyd的答案,如果我的ServiceProxy文件被保存为,

 #lib/some_service/service_proxy.rb 

然后我不必明确要求该文件。

这是关于此问题的有用post。

简而言之,只有遵循正确的命名约定,Rails才会在lib目录中自动加载类。

我通常将require语句放在config / initalizer文件中,例如config/initializers/load_proxy.rb

您是否尝试过从第一个型号中删除它? 我相信Rails会自动加载你lib目录中的任何文件而不必明确require它们。

另请注意,一些environment.rb附带以下注释:

 Rails::Initializer.run do |config| # Add additional load paths for your own custom dirs # config.load_paths += %W( #{RAILS_ROOT}/extras ) config.load_paths << "#{RAILS_ROOT}/app/models/some_model_group" config.load_paths << "#{RAILS_ROOT}/lib" end 

Rails会自动将/lib /vendor /app这个目录添加到自动加载路径中。 当你需要一些常量时,你需要特定的文件。 你不需要第二次,因为它没用。