我何时何地需要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
这个目录添加到自动加载路径中。 当你需要一些常量时,你需要特定的文件。 你不需要第二次,因为它没用。