2011-12-20 43 views
7

Tôi chỉ làm việc trên viên đá quý đầu tiên của tôi (khá mới với ruby), toàn bộ mã cho đến nay là ở đây;Sử dụng các tập tin yaml trong đá quý

https://github.com/mikeyhogarth/tablecloth

Một điều tôi đã cố gắng để làm là để tạo ra một tập tin yaml mà đá quý có thể truy cập như một tra cứu (dưới lib/khăn trải bàn/yaml/qty.yaml). Điều này tất cả các công trình lớn và các bài kiểm tra đơn vị tất cả vượt qua, hwoever khi tôi xây dựng và cài đặt đá quý và cố gắng chạy dưới irb (từ thư mục nhà của tôi) tôi nhận được;

Errno::ENOENT: No such file or directory - lib/tablecloth/yaml/qty.yaml 

Mã hiện đang tìm kiếm tệp trong ~/lib/tablecloth ... thay vì trong thư mục đá quý được cài đặt. Vì vậy, câu hỏi của tôi là;

1) Làm thế nào tôi nên thay đổi dòng 27 của recipe.rb sao cho nó đang tìm trong thư mục mà đá quý được cài đặt?

2) Tôi có thực sự tiếp cận toàn bộ điều này không chính xác (có thích hợp để sử dụng các tệp yaml tĩnh trong đá quý theo cách này) không?

Trả lời

14

Vâng đầu tiên của tất cả các bạn nên tham khảo File theo cách sau:

file_path = File.join(File.dirname(__FILE__),"yaml/qty.yaml") 
units_hash = YAML.load_file(filepath) 

File.dirname(__FILE__) mang đến cho bạn sự thư mục trong đó các tập tin hiện hành (recipe.rb) nằm. File.join kết nối các tập tin theo đúng cách. Vì vậy, bạn nên sử dụng điều này để tham khảo tệp yaml tương đối vào thư mục recipe.rb.

Nếu sử dụng tệp YAML trong trường hợp này là một ý tưởng hay, đó là điều được thảo luận rộng rãi. Tôi, bản thân tôi nghĩ, đây là một cách thích hợp, đặc biệt là khi bắt đầu phát triển với ruby.

Một lựa chọn hợp lệ cho tệp yaml sẽ là tệp rb-File (Mã Ruby), trong đó bạn khai báo các hằng số chứa dữ liệu của bạn. Sau đó bạn có thể sử dụng chúng trực tiếp. Bằng cách này chỉ có thông dịch viên ruby ​​mới có tác dụng và bạn tiết kiệm thời gian tính toán cho những thứ khác. (không cần phân tích cú pháp)

Tuy nhiên trong trường hợp bình thường, bạn cũng nên cẩn thận khi đọc trong tệp YAML có thể không thành công. Vì vậy, bạn sẽ có thể xử lý rằng:

file_path = File.join(File.dirname(__FILE__),"yaml/qty.yaml") 
begin 
    units_hash = YAML.load_file(filepath) 
rescue Psych::SyntaxError 
    $stderr.puts "Invalid yaml-file found, at #{file_path}" 
    exit 1 
rescue Errno::EACCES 
    $stderr.puts "Couldn't access file due to permissions at #{file_path}" 
    exit 1 
rescue Errno::ENOENT 
    $stderr.puts "Couldn't access non-existent file #{file_path}" 
    exit 1 
end 

Hoặc nếu bạn không quan tâm đến các chi tiết:

file_path = File.join(File.dirname(__FILE__),"yaml/qty.yaml") 
units_hash =  
    begin 
    YAML.load_file(filepath) 
    rescue Psych::SyntaxError, Errno::EACCES, Errno::ENOENT 
    {} 
    end 
+1

Cảm ơn. Thật ra, lý do duy nhất tôi làm theo cách này là bởi vì cuốn sách tôi vừa đọc xong cho thấy đó là cách thực hành tốt nhất (không có số ma thuật trong mã, có thể chỉnh sửa bởi người lập trình, vv ..) nhưng tôi lấy ý chí và ý chí của bạn có thể thay đổi điều này tại một số điểm. –

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