Как Ruby узнает, где найти нужный файл? - PullRequest
5 голосов
/ 06 января 2009

Вот еще один вопрос новичка:

require 'tasks/rails'

Я видел эту строку в Rakefile в корневом пути каждого проекта rails. Я предполагаю, что эта строка используется, чтобы потребовать 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', а не полный путь к файлу?

Заранее спасибо.

Ответы [ 3 ]

13 голосов
/ 06 января 2009

Когда вы запускаете ваше приложение rails, оно запускает config / boot.rb, который вызывает Rails::Initializer.set_load_path и устанавливает $LOAD_PATH.

Ruby использует этот список каталогов для поиска файлов, указанных в строке require. Если вы дадите ему абсолютный путь, например require '/home/lolindrath/ruby/lib.rb', поиск будет пропущен.

Это примерно аналогично #include <stdlib.h> в C / C ++, где он ищет путь включения, который вы даете компилятору, чтобы найти этот заголовочный файл.

1 голос
/ 06 января 2009

Я полагаю, потому что ваши пути настроены в вашем файле /config/environment.rb:

require File.join(File.dirname(__FILE__), 'boot')
0 голосов
/ 06 января 2009

Конечно. В /config/boot.rb (вызывается в environment.rb) RAILS_ROOT устанавливается так:

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

Который позволяет вам требовать что-то от корня, я верю. Надеюсь, что это ответ в любом случае!

...