2011-12-20 13 views
7

Pracuję tylko nad moim pierwszym klejnotem (całkiem nowym również dla ruby), cały kod do tej pory jest tutaj;Używanie plików yaml w klejnotach

https://github.com/mikeyhogarth/tablecloth

Jedno Próbowałem zrobić to utworzyć plik yaml którym perełka może uzyskać dostęp jako odnośnika (pod obrus/lib/YAML/qty.yaml). To wszystko działa wspaniale, a jednostka testuje wszystkie przejścia, kiedy buduję i instaluję klejnot i próbuję uruchomić pod irb (z mojego katalogu domowego) otrzymuję;

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

Kod szuka teraz pliku w ~/lib/tablecloth ... zamiast w katalogu, w którym klej jest zainstalowany. Moje pytania są;

1) Jak zmienić wiersz 27 pliku recipe.rb w taki sposób, aby wyglądał w folderze, w którym klej jest zainstalowany?

2) Czy właściwie podchodzę do tej całej sprawy nieprawidłowo (czy w ten sposób można nawet używać statycznych plików yaml w obrębie klejnotów)?

Odpowiedz

14

Więc przede wszystkim należy odnieść się do pliku, w następujący sposób:

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

File.dirname(__FILE__) daje katalog, w którym bieżący plik (recipe.rb) leży. File.join łączy ścieżki do plików we właściwy sposób. Powinieneś użyć tego do odniesienia się do pliku yaml-file względnego do folderu recipe.rb.

Jeśli użycie pliku YAML w tym przypadku jest dobrym pomysłem, jest to temat szeroko dyskutowany. Ja sam uważam, że jest to odpowiedni sposób, szczególnie na początku rozwoju z rubinem.

Ważną alternatywą dla plików yaml byłby plik rb (kod Ruby), w którym zadeklarowane są stałe zawierające dane. Później możesz ich użyć bezpośrednio. W ten sposób musi działać tylko interpreter ruby, a Ty oszczędzasz czas na inne rzeczy. (brak potrzeby tworzenia parsera)

Jednak w normalnym scenariuszu należy także zadbać o to, aby odczyt w pliku YAML mógł się nie powieść. Więc powinieneś być w stanie obsłużyć, że:

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 

Lub jeśli nie dbają o szczegóły:

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

Dzięki. Prawdę powiedziawszy, jedynym powodem, dla którego zrobiłem to w ten sposób, jest to, że książka, którą właśnie skończyłem, sugerowała, że ​​była to najlepsza praktyka (bez magicznych cyfr w kodzie, edytowalna przez nie programistów itp.), Ale ja biorę twój punkt widzenia i będę prawdopodobnie zmieni to w pewnym momencie. –