2012-01-16 30 views
35

trong HOME/path_test/Tôi có:của Ruby tải cấu hình (yaml) tập tin trong cùng một thư mục như là nguồn

load_test.rb:

require 'yaml' 
cnf = YAML::load(File.open('config.yml')) 
puts cnf['Hello'] 

config.yml:

Hello: world!!! 

khi trong HOME/path_test/Tôi nhận được như mong đợi:

-bash-3.2$ ruby load_test.rb 
world!!! 

khi trong HOME/(cd ..) tôi nhận được

-bash-3.2$ ruby path_test/load_test.rb 
path_test/load_test.rb:3:in `initialize': No such file or directory - config.yml  (Errno::ENOENT) 
    from path_test/load_test.rb:3:in `open' 
    from path_test/load_test.rb:3:in `<main>' 

Đó là hành vi đúng, nhưng không phải những gì tôi đã mong ước cho :)

Có cách nào để tải các tập tin .yml tương đối so với nguồn tập tin, và không liên quan đến DIR hiện tại làm việc ??

Solution (load_Test.rb):

require 'yaml' 
fn = File.dirname(File.expand_path(__FILE__)) + '/config.yml' 
cnf = YAML::load(File.open(fn)) 
puts cnf['Hello'] 

Trả lời

74

Bạn sẽ nhận được đường dẫn của file hiện tại bằng cách:

cnf = YAML::load_file(File.join(File.dirname(File.expand_path(__FILE__)), 'config.yml')) 

EDIT:

Kể từ của Ruby 2.0, bạn có thể đơn giản hóa mà và sử dụng:

cnf = YAML::load_file(File.join(__dir__, 'config.yml')) 
+0

Cảm ơn (một ')' quá nhiều vào lúc kết thúc:]) chỉ là những gì tôi cần – FelixHJ

+3

Đây là giải pháp đầy đủ (chia thành 2 dòng để rõ ràng): 'require' yaml ' fn = File.dirname (Tệp .expand_path (__ FILE__)) + '/config.yml' cnf = YAML :: tải (File.open (fn)) đặt cnf ['Hello'] ' – FelixHJ

+0

Hmm tôi không thể nhận được định dạng để làm việc .... – FelixHJ

Các vấn đề liên quan