2009-01-06 8 views
5

Dưới đây là thêm một người mới câu hỏi:Làm thế nào để Ruby biết nơi để tìm một tập tin cần thiết?

require 'tasks/rails' 

tôi thấy dòng này trong Rakefile trong đường dẫn thư mục gốc của mỗi dự án đường ray. Tôi đoán dòng này được sử dụng để yêu cầu nhà cung cấp/ray/railties/lib/nhiệm vụ/rails.rb để có được tất cả các nhiệm vụ cào nạp:

$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 } 

Câu hỏi của tôi là tại sao chỉ 'nhiệm vụ/đường ray' được quy định cho các yêu cầu phương pháp, nhưng không phải là đường dẫn đầy đủ của tập tin?

Xin cảm ơn trước.

Trả lời

13

Khi bạn khởi động đường ray của bạn ứng dụng đó chạy config/boot.rb trong đó kêu gọi Rails::Initializer.set_load_path và thatsets lên $LOAD_PATH .

Ruby sử dụng danh sách thư mục đó để tìm các tệp được chỉ định trên đường dây require. Nếu bạn cho nó một đường dẫn tuyệt đối như require '/home/lolindrath/ruby/lib.rb', nó sẽ bỏ qua tìm kiếm đó.

Điều này tương tự với #include <stdlib.h> trong C/C++, nơi nó tìm kiếm đường dẫn bao gồm bạn cung cấp cho trình biên dịch để tìm tệp tiêu đề đó.

+0

[Liên kết hoạt động] (https://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb#L240) với 'set_load_path' của Rails 2.3. (Số dòng có thể thay đổi, nhưng có thể tệp sẽ không.) (Tôi không biết Rails 3 đặt cùng mã đó ở đâu.) –

1

Tôi tin rằng bởi vì con đường của bạn được thiết lập trong file /config/environment.rb của bạn:

require File.join(File.dirname(__FILE__), 'boot') 
+0

Tôi không hiểu, bạn có thể vui lòng cụ thể hơn không? – eric2323223

+0

Điều này nhận được tên tệp của tập lệnh hiện đang chạy, nó nhận thư mục chứa tệp bằng cách sử dụng File.dirname và sau đó nối thêm tệp mới vào đó (nghĩa là yêu cầu tệp mà bạn biết nằm trong cùng thư mục nhưng không có trong $ LOAD_PATH). Sau đó, File.join an toàn tạo tên tệp mới. – Lolindrath

0

Chắc chắn. Trong /config/boot.rb (gọi tắt là trong environment.rb) các RAILS_ROOT được thiết lập như vậy:

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

nào cho phép bạn yêu cầu điều từ gốc Tôi tin. Hy vọng đó là câu trả lời anyway!