8

这里还有一个新手问题:

require 'tasks/rails'

我在每个 Rails 项目的根路径中的 Rakefile 中看到了这一行。我猜这条线用于要求 vendor/rails/railties/lib/tasks/rails.rb 加载所有 rake 任务:

$VERBOSE = nil
# Load Rails rakefile extensions
Dir["#{File.dirname(__FILE__)}/*.rake"].each { |ext| load ext }
# Load any custom rakefile extensions
Dir["#{RAILS_ROOT}/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
Dir["#{RAILS_ROOT}/vendor/plugins/*/**/tasks/**/*.rake"].sort.each { |ext| load ext }

我的问题是为什么只为 require 方法指定了“tasks/rails”,而不是文件的完整路径?

提前致谢。

4

3 回答 3

14

当你启动你的 Rails 应用程序时,它会运行 config/boot.rb,它会调用Rails::Initializer.set_load_path并设置$LOAD_PATH.

Ruby 使用该目录列表来查找在require一行中指定的文件。如果你给它一个绝对路径,require '/home/lolindrath/ruby/lib.rb'它会跳过那个搜索。

这大致类似于#include <stdlib.h>在 C/C++ 中,它搜索包含路径,您给编译器以查找该头文件。

于 2009-01-06T17:13:29.370 回答
2

我相信因为您的路径是在您的 /config/environment.rb 文件中设置的:

require File.join(File.dirname(__FILE__), 'boot')
于 2009-01-06T16:27:03.223 回答
1

当然。在 /config/boot.rb(在 environment.rb 中调用)中,RAILS_ROOT 设置如下:

RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)

我相信这使您可以从根本上要求事物。无论如何,希望这是答案!

于 2009-01-06T17:15:46.200 回答