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

时间:2010-01-22 21:54:23

标签: ruby-on-rails ruby

假设我的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

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

6 个答案:

答案 0 :(得分:14)

This是关于此问题的有用帖子。

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

您是否尝试过从第一个型号中删除它?我相信Rails会自动加载您lib目录中的所有文件,而无需明确require这些文件。

答案 3 :(得分:0)

另请注意,某些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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

This article 对这个问题也很有帮助。

<块引用>

require 方法将需要的文件名作为字符串作为单个参数。这可以是文件的路径,例如 ./lib/some_library.rb,也可以是缩写名称,例如 some_library。如果参数是路径和完整的文件名,require 方法将在那里查找文件。但是,如果参数是缩写名称,则 require 方法将在系统上的许多预定义目录中搜索该文件。使用缩写名称是使用 require 方法的最常见方式。