До того, как я сделал переход на 1.9.2, я использовал следующее для относительных требований:
require File.expand_path('../relative/path', __FILE__)
Это немного странно, когда вы впервые видите это, потому что похоже, что в начале есть лишний символ "...". Причина в том, что expand_path
расширит путь относительно второго аргумента, а второй аргумент будет интерпретирован, как если бы это был каталог. __FILE__
, очевидно, не является каталогом, но это не имеет значения, поскольку expand_path
не волнует, существуют ли файлы или нет, он просто применяет некоторые правила для расширения таких вещей, как ..
, .
и ~
. Если вы можете преодолеть первоначальное "waitaminute, там нет лишних ..
?" Я думаю, что строка выше работает довольно хорошо.
Если предположить, что __FILE__
равно /absolute/path/to/file.rb
, то expand_path
создаст строку /absolute/path/to/file.rb/../relative/path
, а затем применит правило, гласящее, что ..
должен удалить компонент пути перед ним (file.rb
в этом случае), возвращая /absolute/path/to/relative/path
.
Это лучшая практика? Зависит от того, что вы подразумеваете под этим, но кажется, что это по всей базе кода Rails, так что я бы сказал, что это, по крайней мере, достаточно распространенная идиома.